logo

تيار في جافا

تم تقديم الدفق في جافا 8 يتم استخدام Stream API لمعالجة مجموعات الكائنات. الدفق في Java عبارة عن سلسلة من الكائنات التي تدعم طرقًا مختلفة يمكن توصيلها عبر خطوط الأنابيب لإنتاج النتيجة المطلوبة. 

استخدام الدفق في جافا

استخدامات Stream في Java مذكورة أدناه:



  • يعد Stream API وسيلة للتعبير عن مجموعات الكائنات ومعالجتها.
  • تمكننا من إجراء عمليات مثل تصفية الخرائط وتقليلها والفرز.

كيفية إنشاء دفق جافا

يعد Java Stream Creation إحدى الخطوات الأساسية قبل النظر في وظائف Java Stream. يوجد أدناه بناء الجملة المعطى للإعلان عن Java Stream.

طرق السلسلة جافا

بناء الجملة

تدفقتدفق؛

هنا T إما كائن فئة أو نوع بيانات اعتمادًا على الإعلان.



ميزات جافا ستريم

ميزات تدفقات Java مذكورة أدناه:

  • الدفق ليس بنية بيانات؛ فهو يأخذ فقط المدخلات من صفائف المجموعات أو قنوات الإدخال/الإخراج.
  • لا تقوم التدفقات بتعديل البيانات الأصلية؛ إنهم ينتجون نتائج فقط باستخدام أساليبهم.
  • العمليات الوسيطة (مثل خريطة التصفية وما إلى ذلك) تكون كسولة وتعيد دفقًا آخر حتى تتمكن من ربطها معًا.
  • تؤدي العملية الطرفية (مثل جمع forEach count) إلى إنهاء الدفق وتعطي النتيجة النهائية.

عمليات مختلفة على التدفقات

هناك نوعان من العمليات في التدفقات:

  1. العمليات الوسيطة
  2. العمليات الطرفية

العمليات الوسيطة

عمليات جافا ستريم' title=



العمليات الوسيطة هي أنواع العمليات التي يتم فيها ربط عدة طرق على التوالي.

خصائص العمليات الوسيطة

  • الأساليب مترابطة ببعضها البعض.
  • العمليات الوسيطة تحول الدفق إلى دفق آخر.
  • إنه يمكّن مفهوم التصفية حيث تقوم إحدى الطرق بتصفية البيانات وتمريرها إلى طريقة أخرى بعد المعالجة.

العمليات الوسيطة الهامة

هناك عدد قليل من العمليات الوسيطة المذكورة أدناه:

1. الخريطة () : يتم استخدام طريقة الخريطة لإرجاع دفق يتكون من نتائج تطبيق الوظيفة المحددة على عناصر هذا الدفق.

بناء الجملة:

تدفقخريطة (وظيفةمصمم الخرائط)

2. عامل التصفية () : يتم استخدام طريقة التصفية لتحديد العناصر وفقًا للمسند الذي تم تمريره كوسيطة.

بناء الجملة:

تدفقمرشح (المسندالمسند)

3. تم الترتيب () : يتم استخدام الطريقة المصنفة لفرز الدفق.

بناء الجملة:

تدفقمرتبة ()
تدفقمرتبة (مقارنةالمقارنة)

4. خريطة مسطحة (): يتم استخدام عملية flatMap في Java Streams لتسوية دفق المجموعات في دفق واحد من العناصر.

بناء الجملة:

تدفقخريطة مسطحة (وظيفة> مصمم الخرائط)

5.متميز() : يزيل العناصر المكررة. تقوم بإرجاع دفق يتكون من العناصر المميزة (وفقًا لـ Object.equals(Object)).

بناء الجملة:

تدفقمتميز()

6. نظرة خاطفة () : ينفذ إجراءً على كل عنصر دون تعديل الدفق. تقوم بإرجاع دفق يتكون من عناصر هذا الدفق بالإضافة إلى تنفيذ الإجراء المقدم على كل عنصر حيث يتم استهلاك العناصر من الدفق الناتج.

بناء الجملة:

تدفقنظرة خاطفة (المستهلكفعل)

برنامج جافا يوضح استخدام كافة العمليات الوسيطة:

Java
import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class StreamIntermediateOperationsExample {  public static void main(String[] args) {  // List of lists of names  List<List<String>> listOfLists = Arrays.asList(  Arrays.asList('Reflection' 'Collection' 'Stream')  Arrays.asList('Structure' 'State' 'Flow')  Arrays.asList('Sorting' 'Mapping' 'Reduction' 'Stream')  );  // Create a set to hold intermediate results  Set<String> intermediateResults = new HashSet<>();  // Stream pipeline demonstrating various intermediate operations  List<String> result = listOfLists.stream()  .flatMap(List::stream)   .filter(s -> s.startsWith('S'))   .map(String::toUpperCase)   .distinct()   .sorted()   .peek(s -> intermediateResults.add(s))  .collect(Collectors.toList());   // Print the intermediate results  System.out.println('Intermediate Results:');  intermediateResults.forEach(System.out::println);  // Print the final result  System.out.println('Final Result:');  result.forEach(System.out::println);  } } 

الإخراج
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE 

توضيح:

  • يتم إنشاء listOfLists كقائمة تحتوي على قوائم أخرى من السلاسل.
  • خريطة مسطحة (قائمة :: تيار): يقوم بتسوية القوائم المتداخلة في دفق واحد من السلاسل.
  • عامل التصفية (المرشحات -> s.startsWith('S')) : يقوم بتصفية السلاسل لتشمل فقط تلك التي تبدأ بـ 'S'.
  • الخريطة (سلسلة::toUpperCase) : تحويل كل سلسلة في الدفق إلى أحرف كبيرة.
  • متميز() : يزيل أي سلاسل مكررة.
  • مرتبة () : فرز السلاسل الناتجة أبجديا.
  • نظرة (...): يضيف كل عنصر تمت معالجته إلى مجموعة النتائج المتوسطة للفحص المتوسط.
  • جمع (Collectors.toList ()): يجمع السلاسل النهائية التي تمت معالجتها في قائمة تسمى النتيجة.

يقوم البرنامج بطباعة النتائج الوسيطة المخزنة في مجموعة النتائج المتوسطة. وأخيرا يقوم بطباعة قائمة النتائج التي تحتوي على السلاسل التي تمت معالجتها بالكامل بعد كل عمليات الدفق.

العمليات الطرفية

العمليات الطرفية هي نوع العمليات التي ترجع النتيجة. لا تتم معالجة هذه العمليات بشكل أكبر، فقط قم بإرجاع قيمة النتيجة النهائية.

دمج الفرز جافا

عمليات المحطة الهامة

1. اجمع () : يتم استخدام طريقة التجميع لإرجاع نتيجة العمليات الوسيطة التي يتم إجراؤها على الدفق.

بناء الجملة:

R جمع (جامعجامع)

2. لكل () : يتم استخدام طريقة forEach للتكرار من خلال كل عنصر من عناصر الدفق.

بناء الجملة:

باطلة لكل (Consumerفعل)

3. تقليل (): يتم استخدام طريقة التخفيض لتقليل عناصر الدفق إلى قيمة واحدة. تأخذ طريقة التخفيض BinaryOperator كمعلمة.

بناء الجملة:

T تقليل (هوية T BinaryOperatorتراكم)
خياريتقليل (BinaryOperatorتراكم)

4. العد () : إرجاع عدد العناصر في الدفق.

بناء الجملة:

عدد طويل ()

5. FindFirst() : إرجاع العنصر الأول من الدفق إذا كان موجودًا.

بناء الجملة:

خياريالبحث عن الأول ()

جافا قابل للتجزئة

6.المباراة () : يتحقق مما إذا كانت جميع عناصر الدفق تتطابق مع مسند معين.

بناء الجملة:

منطقية allMatch(المسندالمسند)

7. أي مباراة () : يتحقق مما إذا كان أي عنصر من عناصر الدفق يتطابق مع مسند معين.

بناء الجملة:

منطقية Anymatch (المسندالمسند)

هنا يتم تعيين المتغير ans بالقيمة الأولية ويتم إضافة i إليه.

ملحوظة: يتم تشغيل العمليات الوسيطة بناءً على مفهوم التقييم البطيء الذي يضمن أن تقوم كل طريقة بإرجاع قيمة ثابتة (عملية طرفية) قبل الانتقال إلى الطريقة التالية.

برنامج Java باستخدام كافة العمليات الطرفية:

Java
import java.util.*; import java.util.stream.Collectors; public class StreamTerminalOperationsExample {  public static void main(String[] args) {  // Sample data  List<String> names = Arrays.asList(  'Reflection' 'Collection' 'Stream'  'Structure' 'Sorting' 'State'  );  // forEach: Print each name  System.out.println('forEach:');  names.stream().forEach(System.out::println);  // collect: Collect names starting with 'S' into a list  List<String> sNames = names.stream()  .filter(name -> name.startsWith('S'))  .collect(Collectors.toList());  System.out.println('ncollect (names starting with 'S'):');  sNames.forEach(System.out::println);  // reduce: Concatenate all names into a single string  String concatenatedNames = names.stream().reduce(  ''  (partialString element) -> partialString + ' ' + element  );  System.out.println('nreduce (concatenated names):');  System.out.println(concatenatedNames.trim());  // count: Count the number of names  long count = names.stream().count();  System.out.println('ncount:');  System.out.println(count);  // findFirst: Find the first name  Optional<String> firstName = names.stream().findFirst();  System.out.println('nfindFirst:');  firstName.ifPresent(System.out::println);  // allMatch: Check if all names start with 'S'  boolean allStartWithS = names.stream().allMatch(  name -> name.startsWith('S')  );  System.out.println('nallMatch (all start with 'S'):');  System.out.println(allStartWithS);  // anyMatch: Check if any name starts with 'S'  boolean anyStartWithS = names.stream().anyMatch(  name -> name.startsWith('S')  );  System.out.println('nanyMatch (any start with 'S'):');  System.out.println(anyStartWithS);  } } 

الإخراج:

StreamsOutput' loading='lazy' title=الإخراج

توضيح:

  • يتم إنشاء قائمة الأسماء باستخدام سلاسل عينة.
  • لكل: طباعة كل اسم في القائمة.
  • يجمع : يقوم بتصفية الأسماء التي تبدأ بالحرف 'S' ويجمعها في قائمة جديدة.
  • يقلل : يسلسل جميع الأسماء في سلسلة واحدة.
  • عدد : لحساب العدد الإجمالي للأسماء.
  • findFirst : يبحث عن الاسم الأول في القائمة ويطبعه.
  • allMatch : يتحقق مما إذا كانت جميع الأسماء تبدأ بالحرف "S".
  • سيئ الحظ : يتحقق مما إذا كان أي اسم يبدأ بحرف "S".

يقوم البرنامج بطباعة كل أسماء الأسماء التي تبدأ بحرف "S" من الأسماء المتسلسلة وعدد الأسماء الاسم الأول سواء كانت جميع الأسماء تبدأ بحرف "S" وما إذا كان أي اسم يبدأ بحرف "S".

الاستفادة من جافا ستريم

هناك بعض الفوائد التي بسببها نستخدم Stream في Java كما هو مذكور أدناه:

  • لا يوجد تخزين
  • خط أنابيب الوظائف
  • الكسل
  • يمكن أن تكون لا نهائية
  • يمكن أن تكون موازية
  • يمكن إنشاؤها من مجموعات ومصفوفات وأساليب خطوط الملفات في Stream IntStream وما إلى ذلك.

حالات الاستخدام الواقعية لتدفقات Java

تُستخدم التدفقات على نطاق واسع في تطبيقات Java الحديثة من أجل:

  • معالجة البيانات
  • لمعالجة استجابات JSON/XML
  • لعمليات قاعدة البيانات
  • المعالجة المتزامنة