logo

Потік на Java

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

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

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



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

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

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

string.format

Синтаксис

Потікпотік;

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



Функції Java Stream

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

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

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

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

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

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

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



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

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

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

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

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

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

Синтаксис:

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

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

Синтаксис:

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

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

Синтаксис:

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

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

Синтаксис:

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

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

Синтаксис:

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

"що таке 10 із 100"

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' loading='lazy' title=Вихід

Пояснення:

  • Список імен створюється за допомогою зразків рядків.
  • для кожного: Друкує кожне ім’я зі списку.
  • збирати : фільтрує імена, що починаються з «S», і збирає їх у новий список.
  • зменшити : об’єднує всі імена в один рядок.
  • розраховувати : підраховує загальну кількість імен.
  • findFirst : знаходить і друкує перше ім’я у списку.
  • allMatch : перевіряє, чи всі імена починаються з літери «S».
  • невдалий : Перевіряє, чи будь-яке ім’я починається з «S».

Програма друкує кожне ім’я, імена, що починаються з «S», об’єднані імена, кількість імен, ім’я, чи всі імена починаються з «S», і будь-яке ім’я починається з «S».

Переваги Java Stream

Нижче наведено деякі переваги, завдяки яким ми використовуємо Stream у Java:

  • Немає місця для зберігання
  • Конвеєр функцій
  • Лінь
  • Може бути нескінченним
  • Можна паралелізувати
  • Можна створити з колекцій масивів файлів рядків методів у Stream IntStream тощо.

Реальні приклади використання потоків Java

Потоки широко використовуються в сучасних програмах Java для:

  • Обробка даних
  • Для обробки відповідей JSON/XML
  • Для операцій з базою даних
  • Паралельна обробка