Поток в Java

Поток в Java

Потокът беше въведен в Java 8 API на Stream се използва за обработка на колекции от обекти. Потокът в Java е поредица от обекти, която поддържа различни методи, които могат да бъдат конвейерно обработени, за да се получи желаният резултат. 

Използване на Stream в Java

Употребите на Stream в Java са споменати по-долу:

  • Stream API е начин за изразяване и обработка на колекции от обекти.
  • Позволете ни да извършваме операции като филтриране, картографиране, намаляване и сортиране.

Как да създадете Java поток

Създаването на Java Stream е една от най-основните стъпки преди разглеждане на функционалностите на Java Stream. По-долу е даден синтаксис за деклариране на Java поток.

Синтаксис

Поток поток;

Тук T е или обект на клас, или тип данни в зависимост от декларацията.

Характеристики на Java поток

Характеристиките на Java потоците са споменати по-долу:

  • Потокът не е структура от данни; той просто приема вход от масиви от колекции или I/O канали.
  • Потоците не променят оригиналните данни; те дават резултати само чрез своите методи.
  • Междинните операции (като филтърна карта и т.н.) са мързеливи и връщат друг поток, така че можете да ги свържете заедно.
  • Терминална операция (като collect forEach count) завършва потока и дава крайния резултат.

Различни операции върху потоци

Има два типа операции в потоци:

  1. Междинни операции
  2. Терминални операции

Междинни операции

Java Stream Операции

Междинните операции са типовете операции, при които множество методи са верижно свързани в един ред.

Характеристики на междинните операции

  • Методите са верижно свързани.
  • Междинните операции трансформират един поток в друг поток.
  • Той позволява концепцията за филтриране, при която един метод филтрира данни и ги предава на друг метод след обработка.

Важни междинни операции

Има няколко междинни операции, споменати по-долу:

1. карта() : Методът map се използва за връщане на поток, състоящ се от резултатите от прилагането на дадена функция към елементите на този поток.

Синтаксис:

Поток карта (функция картограф)

2. филтър() : Филтърният метод се използва за избиране на елементи според предиката, подаден като аргумент.

Синтаксис:

Поток филтър (предикат предикат)

3. сортиран() : Сортираният метод се използва за сортиране на потока.

Синтаксис:

Поток сортиран()
Поток сортиран (Comparator компаратор)

4. flatMap(): Операцията flatMap в Java Streams се използва за изравняване на поток от колекции в единичен поток от елементи.

Синтаксис:

Поток flatMap(функция > картограф)

5. различен() : Премахва дублирани елементи. Той връща поток, състоящ се от отделните елементи (според Object.equals(Object)).

Синтаксис:

Поток различен()

6. надникнете () : Извършва действие върху всеки елемент, без да променя потока. Той връща поток, състоящ се от елементите на този поток, като допълнително изпълнява предоставеното действие върху всеки елемент, тъй като елементите се консумират от резултантния поток.

Синтаксис:

Поток peek(Потребител действие)

Java програма, която демонстрира използването на всички междинни операции:

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 се създава като списък, съдържащ други списъци с низове.
  • flatMap (Списък :: поток): Изравнява вложените списъци в единичен поток от низове.
  • filter(s -> s.startsWith('S')) : Филтрира низовете, за да включва само тези, които започват с „S“.
  • map(String::toUpperCase) : Преобразува всеки низ в потока в главни букви.
  • различен() : Премахва всички дублиращи се низове.
  • сортиран() : Сортира получените низове по азбучен ред.
  • надникнете (...): Добавя всеки обработен елемент към набора intermediateResults за междинна проверка.
  • събира (Collectors.toList()): Събира окончателно обработените низове в списък, наречен резултат.

Програмата отпечатва междинните резултати, съхранени в набора intermediateResults. Накрая той отпечатва списъка с резултати, който съдържа напълно обработените низове след всички поточни операции.

Терминални операции

Терминалните операции са типът операции, които връщат резултата. Тези операции не се обработват допълнително, а само връщат крайна резултатна стойност.

Важни операции на терминала

1. събирам() : Методът collect се използва за връщане на резултата от междинните операции, извършени в потока.

Синтаксис:

R collect(Колектор колекционер)

2. forEach() : Методът forEach се използва за итерация през всеки елемент от потока.

Синтаксис:

void forEach(Потребител действие)

3. намаляване (): Методът за намаляване се използва за намаляване на елементите на потока до една стойност. Методът за намаляване приема BinaryOperator като параметър.

Синтаксис:

T reduce(T identity BinaryOperator акумулатор)
Не е задължително намали (двоичен оператор акумулатор)

4. брой() : Връща броя на елементите в потока.

Синтаксис:

дълго броене()

5. findFirst() : Връща първия елемент от потока, ако присъства.

Синтаксис:

Не е задължително findFirst()

6. allMatch() : Проверява дали всички елементи на потока съответстват на даден предикат.

Синтаксис:

boolean allMatch(Предикат предикат)

7. Anymatch () : Проверява дали някой елемент от потока съответства на даден предикат.

Синтаксис:

Boolean Anymatch (предикат предикат)

Тук на променливата ans се присвоява 0 като начална стойност и 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Изход

Обяснение:

  • Списъкът с имена е създаден с примерни низове.
  • за всеки: Отпечатва всяко име в списъка.
  • събирам : Филтрира имена, започващи с 'S' и ги събира в нов списък.
  • намалявам : Свързва всички имена в един низ.
  • брой : Брои общия брой имена.
  • findFirst : Намира и отпечатва първото име в списъка.
  • allMatch : Проверява дали всички имена започват с 'S'.
  • нещастен : Проверява дали някое име започва с 'S'.

Програмата отпечатва имената на всяко име, започващи с 'S' свързани имена броя на имената първото име дали всички имена започват с 'S' и дали някое име започва с 'S'.

Предимства на Java Stream

Има някои предимства, поради които използваме Stream в Java, както е споменато по-долу:

  • Без съхранение
  • Конвейер от функции
  • мързел
  • Може да бъде безкраен
  • Може да се паралелизира
  • Може да се създаде от масиви от колекции Файлове Редове Методи в Stream IntStream и др.

Реални случаи на използване на Java потоци

Потоците се използват широко в съвременните Java приложения за:

  • Обработка на данни
  • За обработка на JSON/XML отговори
  • За операции с бази данни
  • Едновременна обработка