Потік на Java
API Stream, представлений у Java 8, використовується для обробки колекцій об’єктів. Потік у Java — це послідовність об’єктів, яка підтримує різні методи, які можуть бути конвеєрними для отримання бажаного результату.
Використання потоку в Java
Нижче наведено використання потоку в Java:
- Stream API — це спосіб вираження та обробки колекцій об’єктів.
- Дозвольте нам виконувати такі операції, як фільтрація, відображення, скорочення та сортування.
Як створити потік Java?
Створення Java Stream є одним із основних кроків перед розглядом функціональних можливостей Java Stream. Нижче наведено синтаксис того, як оголосити Java Stream.
Синтаксис
Stream stream;
Тут Т є класом, об’єктом або типом даних залежно від оголошення.
Функції Java Stream
Нижче наведено особливості потоку Java:
- Потік не є структурою даних, натомість він отримує вхідні дані від колекцій, масивів або каналів введення/виведення.
- Потоки не змінюють вихідну структуру даних, вони лише надають результат відповідно до конвеєрних методів.
- Кожна проміжна операція виконується ліниво і в результаті повертає потік, тому різні проміжні операції можуть бути конвеєрними. Термінальні операції позначають кінець потоку та повертають результат.
Різні операції над потоками
Існує два типи операцій у потоках:
- Проміжні операції
- Припинити операції
Проміжні операції
Проміжні операції — це типи операцій, у яких декілька методів з’єднані в ряд.
Характеристика проміжних операцій
- Методи з’єднані разом.
- Проміжні операції перетворюють потік в інший потік.
- Це дозволяє концепцію фільтрації, коли один метод фільтрує дані та передає їх іншому методу після обробки.
Переваги Java Stream
Нижче наведено деякі переваги, завдяки яким ми використовуємо Stream у Java:
- Немає місця для зберігання
- Конвеєр функцій
- Лінь
- Може бути нескінченним
- Можна паралелізувати
- Можна створювати з колекцій, масивів, рядків файлів, методів у Stream, IntStream тощо.
Важливі проміжні операції
Нижче наведено кілька проміжних операцій:
1. map()
Метод map використовується для повернення потоку, що складається з результатів застосування заданої функції до елементів цього потоку.
List number = Arrays.asList(2,3,4,5); List square = number.stream().map(x->x*x).collect(Collectors.toList());
2. filter()
Метод фільтра використовується для вибору елементів відповідно до предикату, переданого як аргумент.
List names = Arrays.asList('Reflection','Collection','Stream'); List result = names.stream().filter(s->s.startsWith('S')).collect(Collectors.toList()); 3. відсортований()
Метод сортування використовується для сортування потоку.
List names = Arrays.asList('Reflection','Collection','Stream'); List result = names.stream().sorted().collect(Collectors.toList()); Термінальні операції
Операції терміналу — це тип операцій, які повертають результат. Ці операції не обробляються далі, а повертають кінцеве значення результату.
Важливі термінальні операції
Нижче наведено кілька термінальних операцій:
1. collect()
Метод collect використовується для повернення результату проміжних операцій, виконаних над потоком.
List number = Arrays.asList(2,3,4,5,3); Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
2. forEach()
Метод forEach використовується для проходження кожного елемента потоку.
List number = Arrays.asList(2,3,4,5); number.stream().map(x->x*x).forEach(y->System.out.println(y));
3. зменшити()
Метод зменшення використовується для зведення елементів потоку до одного значення. Метод reduce приймає BinaryOperator як параметр.
List number = Arrays.asList(2,3,4,5); int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);
Тут змінній ans присвоюється 0 як початкове значення, а i додається до неї.
Примітка: Проміжні операції виконуються на основі концепції відкладеної оцінки, яка гарантує, що кожен метод повертає фіксоване значення (термінальна операція) перед переходом до наступного методу.
Приклад Java Stream
Java
// Java program to demonstrate> // the use of stream in java> import> java.util.*;> import> java.util.stream.*;> class> Demo {> > public> static> void> main(String args[])> > {> > // create a list of integers> > List number = Arrays.asList(> 2> ,> 3> ,> 4> ,> 5> );> > // demonstration of map method> > List square> > = number.stream()> > .map(x ->x * x)> > .collect(Collectors.toList());> > // create a list of String> > List names = Arrays.asList(> > 'Reflection'> ,> 'Collection'> ,> 'Stream'> );> > // demonstration of filter method> > List result> > = names.stream()> > .filter(s ->s.startsWith(> 'S'> ))> > .collect(Collectors.toList());> > > System.out.println(result);> > // demonstration of sorted method> > List show> > = names.stream()> > .sorted()> > .collect(Collectors.toList());> > > System.out.println(show);> > // create a list of integers> > List numbers> > = Arrays.asList(> 2> ,> 3> ,> 4> ,> 5> ,> 2> );> > // collect method returns a set> > Set squareSet> > = numbers.stream()> > .map(x ->х * х)> > .collect(Collectors.toSet());> > > System.out.println(squareSet);> > // demonstration of forEach method> > number.stream()> > .map(x ->x * x)> > .forEach(y ->System.out.println(y));> > // demonstration of reduce method> > int> even> > = number.stream()> > .filter(x ->x %>> 2> ==> 0> )> > .reduce(> 0> , (ans, i) ->ans + i);> > System.out.println(even);> > }> }> |
Вихід
[4, 9, 16, 25] [Stream] [Collection, Reflection, Stream] [16, 4, 9, 25] 4 9 16 25 6
Важливі моменти/спостереження щодо Java Stream
- Потік складається з джерела, за яким слідує нуль або більше проміжних методів, об’єднаних (конвеєрних), і термінального методу для обробки об’єктів, отриманих із джерела відповідно до описаних методів.
- Потік використовується для обчислення елементів відповідно до конвеєрних методів без зміни початкового значення об’єкта.