لذا، أنت هنا لتتعرف على الجداول في جافا، ولكن ليس نوع الجداول التي يذهب إليها الناس للصيد أو تدفقات المياه. نحن نتحدث عن تدفقات البيانات، وهي ميزة قوية تم تقديمها في Java 8 والتي تجعل العمل مع البيانات أسهل كثيرًا. سواء كنت جديدًا على هذا الأمر أو جربته ولكنك لم تتمكن من حله تمامًا، فلا تقلق. سأرشدك خلال الرحلة بأكملها بلغة واضحة وسهلة الفهم.
مستعد؟ هيا بنا نتعمق في Java Streams!
أ الدفق هو وسيلة لمعالجة البيانات في تسلسل. تخيل أن لديك قائمة بالعناصر، وتريد أن تفعل شيئًا بهذه العناصر (تصفية، أو فرز، أو خريطة، وما إلى ذلك). يتيح لك Stream القيام بكل ذلك بطريقة نظيفة وفعالة. إنه يشبه خط التجميع حيث تتدفق بياناتك عبر خطوات مختلفة حتى تتم معالجتها.
الأشياء الأساسية التي يجب تذكرها حول عمليات البث:
لماذا لا تستخدم فقط حلقة for أو تتعامل مع المجموعات مباشرة؟ حسنًا، هناك ثلاثة أسباب رئيسية:
دعونا نلقي نظرة على النوعين الرئيسيين لعمليات البث: المتوسطة و المحطة الطرفية.
هذه هي العمليات التي تجهز البيانات ولكنها لا تنتج نتيجة نهائية على الفور. فكر في هذه الخطوات على أنها خطوات "ورشة العمل".
فلتر()
هذا مثل الغربال. فهو يختار العناصر بناءً على الشرط. على سبيل المثال، إذا كنت تريد فقط الأرقام الزوجية من قائمة الأعداد الصحيحة، فيمكنك استخدام عامل التصفية ().
java Copy code Listnumbers = Arrays.asList(1, 2, 3, 4, 5); List evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // Output: [2, 4]
لماذا التصفية؟ بدون عامل التصفية()، ستحتاج إلى تكرار القائمة يدويًا وإضافة العناصر المطابقة فقط إلى القائمة الجديدة. يتيح لك عامل التصفية () القيام بذلك في خطوة واحدة واضحة.
رسم خريطة()
هذا محول. يأخذ عنصرًا ويعيد شيئًا مختلفًا. على سبيل المثال، إذا كان لديك قائمة من السلاسل وتريد أطوال كل سلسلة:
java Copy code Listwords = Arrays.asList("apple", "banana", "cherry"); List lengths = words.stream() .map(String::length) .collect(Collectors.toList()); // Output: [5, 6, 6]
لماذا الخريطة؟ يتم استخدام الخريطة () عندما تحتاج إلى تحويل كل عنصر إلى شيء آخر، مثل تحويل قائمة السلاسل إلى قائمة أطوالها.
متميز()
إنه مثل مرشح مكرر. يؤدي هذا إلى إزالة العناصر المكررة من الدفق.
java Copy code Listnumbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5); List distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); // Output: [1, 2, 3, 4, 5]
لماذا التميز؟ في القائمة العادية، ستحتاج إلى التحقق يدويًا من التكرارات. متميزة () تفعل ذلك لك في سطر واحد.
مرتبة()
يعمل هذا على فرز بياناتك بترتيب طبيعي (أو بترتيب مخصص، إذا أردت).
java Copy code Listnames = Arrays.asList("Charlie", "Alice", "Bob"); List sortedNames = names.stream() .sorted() .collect(Collectors.toList()); // Output: ["Alice", "Bob", "Charlie"]
لماذا يتم الفرز؟ بدلاً من كتابة منطق الفرز بنفسك، يتولى الترتيب () الأمر نيابةً عنك.
هذه هي العناصر التي تنتج النتيجة النهائية، وتؤدي إلى معالجة الدفق بأكمله. فكر في هذه على أنها "نقطة الخروج".
يجمع()
هذه هي العملية الطرفية الأكثر شيوعًا. فهو يجمع نتائج الدفق ويضعها في قائمة أو مجموعة أو مجموعة أخرى.
java Copy code Listnames = Arrays.asList("Charlie", "Alice", "Bob"); List upperNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList()); // Output: ["CHARLIE", "ALICE", "BOB"]
لماذا التجميع؟ ستستخدم دائمًا تقريبًا التجميع () لجمع نتائج التدفق الخاص بك في مجموعة. إنها محطتك النهائية.
forEach()
إذا لم تكن بحاجة إلى نتيجة وتريد فقط تنفيذ إجراء على كل عنصر (مثل طباعتها)، فإن forEach() هو صديقك.
java Copy code numbers.stream() .forEach(System.out::println);
لماذا forEach؟ هذا مثالي للآثار الجانبية، مثل طباعة البيانات إلى وحدة التحكم أو الكتابة إلى ملف.
يقلل()
reduce() يأخذ مجموعة من البيانات ويلخصها في نتيجة واحدة. على سبيل المثال، جمع قائمة من الأرقام:
java Copy code int sum = numbers.stream() .reduce(0, Integer::sum); // Output: 15
لماذا التقليل؟ عندما تحتاج إلى دمج القيم أو تجميعها في نتيجة واحدة، فإن تقليل () هو الحل الأمثل لك.
لا يتم إنشاء جميع التدفقات من المجموعات. توفر Java أنواعًا أخرى من التدفقات للتعامل مع أنواع مختلفة من البيانات:
IntStream، LongStream، DoubleStream
هذه التدفقات متخصصة في التعامل مع الأنواع البدائية. بدلاً من تحديد القيم وإلغاء تحديدها مثل Stream
مثال:
java Copy code IntStream intStream = IntStream.of(1, 2, 3, 4); int sum = intStream.sum(); // Output: 10
دفق الملفات
يمكنك إنشاء تدفقات من الملفات باستخدام Files.lines().
java Copy code try (Streamlines = Files.lines(Paths.get("data.txt"))) { lines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
لماذا نستخدم تدفقات الملفات؟ عند التعامل مع الملفات الكبيرة، قد لا يكون تحميل جميع البيانات في الذاكرة فعالاً. يتيح لك استخدام الدفق معالجتها سطرًا تلو الآخر.
سؤال جيد! دعونا نقارن:
تدور عمليات التدفق في Java حول تبسيط طريقة معالجة البيانات. إنها تجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة، وأسهل في الصيانة، وأكثر كفاءة عند العمل مع المجموعات. سواء كنت تقوم بتصفية البيانات أو تحويلها أو تقليلها، فإن التدفقات توفر لك طرقًا واضحة ومباشرة تلغي الحاجة إلى حلقات ضخمة وعمل يدوي.
الآن بعد أن أصبحت مجهزًا جيدًا بأساسيات التدفقات، لماذا تتوقف هنا؟ تابعني على Twitter أو LinkedIn أو قم بمراجعة مدونتي للحصول على المزيد من نصائح Java التي ستجعلك محترفًا في وقت قصير! وإذا وجدت هذا الدليل مفيدًا، فشاركه مع زملائك من المطورين — لأن المشاركة تعني الاهتمام!
هل أنت مستعد لتجربتها؟ هيا بنا نجعل هذا التدفق يتدفق في مشروعك القادم!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3