Потік на Java
Стрім було введено в Java 8 Stream API використовується для обробки колекцій об’єктів. Потік у Java — це послідовність об’єктів, яка підтримує різні методи, які можуть бути конвеєрними для отримання бажаного результату.
Використання потоку в Java
Використання потоку в Java згадується нижче:
- Stream API — це спосіб вираження та обробки колекцій об’єктів.
- Дозвольте нам виконувати такі операції, як фільтрація, відображення, скорочення та сортування.
Як створити потік Java
Створення Java Stream є одним із основних кроків перед розглядом функціональних можливостей Java Stream. Нижче наведено синтаксис для оголошення потоку Java.
Синтаксис
Потік
потік;
Тут T є або об’єктом класу, або типом даних залежно від оголошення.
Функції Java Stream
Нижче наведено особливості потоків Java:
- Потік не є структурою даних; він просто приймає вхідні дані з масивів колекцій або каналів введення/виведення.
- Потоки не змінюють вихідні дані; вони дають результати лише за допомогою своїх методів.
- Проміжні операції (наприклад, карта фільтрів тощо) є лінивими та повертають інший потік, щоб ви могли об’єднати їх.
- Термінальна операція (наприклад collect forEach count) завершує потік і дає остаточний результат.
Різні операції над потоками
Існує два типи операцій у потоках:
- Проміжні операції
- Термінальні операції
Проміжні операції
Проміжні операції — це типи операцій, у яких кілька методів з’єднані в ряд.
Характеристика проміжних операцій
- Методи з’єднані разом.
- Проміжні операції перетворюють потік в інший потік.
- Це дозволяє концепцію фільтрації, коли один метод фільтрує дані та передає їх іншому методу після обробки.
Важливі проміжні операції
Нижче наведено кілька проміжних операцій:
1. map() : метод map використовується для повернення потоку, що складається з результатів застосування заданої функції до елементів цього потоку.
Синтаксис:
Потік map(Функція super T ? extends R>картограф)
2. filter() : метод filter використовується для вибору елементів відповідно до предикату, переданого як аргумент.
Синтаксис:
Потік
фільтр (предикат super T>присудок)
3. відсортований() : сортований метод використовується для сортування потоку.
Синтаксис:
Потік
відсортовано()
Потіквідсортовано (компаратор super T>компаратор)
4. flatMap(): Операція flatMap у Java Streams використовується для зведення потоку колекцій у єдиний потік елементів.
Синтаксис:
Потік flatMap(функція super T ? extends Stream extends R>> картограф)
5. відмінний() : видаляє повторювані елементи. Він повертає потік, що складається з різних елементів (відповідно до Object.equals(Object)).
Синтаксис:
Потік
відмінний()
6. peek() : Виконує дію над кожним елементом, не змінюючи потік. Він повертає потік, що складається з елементів цього потоку, додатково виконуючи надану дію над кожним елементом, оскільки елементи споживаються з результуючого потоку.
Синтаксис:
Потік
peek(споживач super T>дія)
Програма 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(Збирач super T A R>колекціонер)
2. forEach() : метод forEach використовується для проходження кожного елемента потоку.
Синтаксис:
void forEach(Consumer super T>дія)
3. зменшити(): Метод зменшення використовується для зведення елементів потоку до одного значення. Метод reduce приймає BinaryOperator як параметр.
Синтаксис:
T reduce(T identity BinaryOperator
акумулятор)
Додатковозменшити (BinaryOperator акумулятор)
4. count() : повертає кількість елементів у потоці.
Синтаксис:
довгий рахунок()
5. findFirst() : повертає перший елемент потоку, якщо він є.
Синтаксис:
Додатково
findFirst()
6. allMatch() : перевіряє, чи всі елементи потоку відповідають даному предикату.
Синтаксис:
boolean allMatch(Предикат super T>присудок)
7. Anymatch () : Перевіряє, чи будь-який елемент потоку відповідає даному предикату.
Синтаксис:
Логічний будь-який збіг (предикат super T>присудок)
Тут змінній 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 ); } }
Вихід:
Вихід Пояснення:
- Список імен створюється за допомогою зразків рядків.
- для кожного: Друкує кожне ім’я зі списку.
- збирати : фільтрує імена, що починаються з «S», і збирає їх у новий список.
- зменшити : об’єднує всі імена в один рядок.
- розраховувати : підраховує загальну кількість імен.
- findFirst : знаходить і друкує перше ім’я у списку.
- allMatch : перевіряє, чи всі імена починаються з літери «S».
- невдалий : Перевіряє, чи будь-яке ім’я починається з «S».
Програма друкує кожне ім’я, імена, що починаються з «S», об’єднані імена, кількість імен, ім’я, чи всі імена починаються з «S», і будь-яке ім’я починається з «S».
Переваги Java Stream
Нижче наведено деякі переваги, завдяки яким ми використовуємо Stream у Java:
- Немає місця для зберігання
- Конвеєр функцій
- Лінь
- Може бути нескінченним
- Можна паралелізувати
- Можна створити з колекцій масивів файлів рядків методів у Stream IntStream тощо.
Реальні приклади використання потоків Java
Потоки широко використовуються в сучасних програмах Java для:
- Обробка даних
- Для обробки відповідей JSON/XML
- Для операцій з базою даних
- Паралельна обробка