Стрім було введено в 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. 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)).
Синтаксис:
Потік
відмінний() "що таке 10 із 100"
6. peek() : Виконує дію над кожним елементом, не змінюючи потік. Він повертає потік, що складається з елементів цього потоку, додатково виконуючи надану дію над кожним елементом, оскільки елементи споживаються з результуючого потоку.
Синтаксис:
Потік
peek(споживач super T>дія)
Програма Java, яка демонструє використання всіх проміжних операцій:
Javaimport 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 з використанням усіх термінальних операцій:
Javaimport 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
- Для операцій з базою даних
- Паралельна обробка