Потік на Java

Потік на Java

Стрім було введено в Java 8 Stream API використовується для обробки колекцій об’єктів. Потік у Java — це послідовність об’єктів, яка підтримує різні методи, які можуть бути конвеєрними для отримання бажаного результату. 

Використання потоку в Java

Використання потоку в Java згадується нижче:

  • Stream API — це спосіб вираження та обробки колекцій об’єктів.
  • Дозвольте нам виконувати такі операції, як фільтрація, відображення, скорочення та сортування.

Як створити потік Java

Створення Java Stream є одним із основних кроків перед розглядом функціональних можливостей Java Stream. Нижче наведено синтаксис для оголошення потоку Java.

Синтаксис

Потік потік;

Тут T є або об’єктом класу, або типом даних залежно від оголошення.

Функції Java Stream

Нижче наведено особливості потоків Java:

  • Потік не є структурою даних; він просто приймає вхідні дані з масивів колекцій або каналів введення/виведення.
  • Потоки не змінюють вихідні дані; вони дають результати лише за допомогою своїх методів.
  • Проміжні операції (наприклад, карта фільтрів тощо) є лінивими та повертають інший потік, щоб ви могли об’єднати їх.
  • Термінальна операція (наприклад collect forEach count) завершує потік і дає остаточний результат.

Різні операції над потоками

Існує два типи операцій у потоках:

  1. Проміжні операції
  2. Термінальні операції

Проміжні операції

Потокові операції Java

Проміжні операції — це типи операцій, у яких кілька методів з’єднані в ряд.

Характеристика проміжних операцій

  • Методи з’єднані разом.
  • Проміжні операції перетворюють потік в інший потік.
  • Це дозволяє концепцію фільтрації, коли один метод фільтрує дані та передає їх іншому методу після обробки.

Важливі проміжні операції

Нижче наведено кілька проміжних операцій:

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

Синтаксис:

Потік map(Функція картограф)

2. filter() : метод filter використовується для вибору елементів відповідно до предикату, переданого як аргумент.

Синтаксис:

Потік фільтр (предикат присудок)

3. відсортований() : сортований метод використовується для сортування потоку.

Синтаксис:

Потік відсортовано()
Потік відсортовано (компаратор компаратор)

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

Синтаксис:

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

5. відмінний() : видаляє повторювані елементи. Він повертає потік, що складається з різних елементів (відповідно до Object.equals(Object)).

Синтаксис:

Потік відмінний()

6. peek() : Виконує дію над кожним елементом, не змінюючи потік. Він повертає потік, що складається з елементів цього потоку, додатково виконуючи надану дію над кожним елементом, оскільки елементи споживаються з результуючого потоку.

Синтаксис:

Потік 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 для проміжної перевірки.
  • collect(Collectors.toList()): Збирає остаточно оброблені рядки в список під назвою результат.

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

Термінальні операції

Операції терміналу — це тип операцій, які повертають результат. Ці операції не обробляються далі, а повертають кінцеве значення результату.

Важливі термінальні операції

1. collect() : метод collect використовується для повернення результату проміжних операцій, виконаних над потоком.

Синтаксис:

R collect(Збирач колекціонер)

2. forEach() : метод forEach використовується для проходження кожного елемента потоку.

Синтаксис:

void forEach(Consumer дія)

3. зменшити(): Метод зменшення використовується для зведення елементів потоку до одного значення. Метод reduce приймає BinaryOperator як параметр.

Синтаксис:

T reduce(T identity BinaryOperator акумулятор)
Додатково зменшити (BinaryOperator акумулятор)

4. count() : повертає кількість елементів у потоці.

Синтаксис:

довгий рахунок()

5. findFirst() : повертає перший елемент потоку, якщо він є.

Синтаксис:

Додатково findFirst()

6. allMatch() : перевіряє, чи всі елементи потоку відповідають даному предикату.

Синтаксис:

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

7. 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
  • Для операцій з базою даних
  • Паралельна обробка