Потокът беше въведен в Java 8 API на Stream се използва за обработка на колекции от обекти. Потокът в Java е поредица от обекти, която поддържа различни методи, които могат да бъдат конвейерно обработени, за да се получи желаният резултат.
Използване на Stream в Java
Употребите на Stream в Java са споменати по-долу:
- Stream API е начин за изразяване и обработка на колекции от обекти.
- Позволете ни да извършваме операции като филтриране, картографиране, намаляване и сортиране.
Как да създадете Java поток
Създаването на Java Stream е една от най-основните стъпки преди разглеждане на функционалностите на Java Stream. По-долу е даден синтаксис за деклариране на Java поток.
шаблони на java софтуер
Синтаксис
Поток
поток;
Тук T е или обект на клас, или тип данни в зависимост от декларацията.
Характеристики на Java поток
Характеристиките на Java потоците са споменати по-долу:
- Потокът не е структура от данни; той просто приема вход от масиви от колекции или I/O канали.
- Потоците не променят оригиналните данни; те дават резултати само чрез своите методи.
- Междинните операции (като филтърна карта и т.н.) са мързеливи и връщат друг поток, така че можете да ги свържете заедно.
- Терминална операция (като collect forEach count) завършва потока и дава крайния резултат.
Различни операции върху потоци
Има два типа операции в потоци:
- Междинни операции
- Терминални операции
Междинни операции

Междинните операции са типовете операции, при които множество методи са верижно свързани в един ред.
Характеристики на междинните операции
- Методите са верижно свързани.
- Междинните операции трансформират един поток в друг поток.
- Той позволява концепцията за филтриране, при която един метод филтрира данни и ги предава на друг метод след обработка.
Важни междинни операции
Има няколко междинни операции, споменати по-долу:
1. карта() : Методът map се използва за връщане на поток, състоящ се от резултатите от прилагането на дадена функция към елементите на този поток.
Синтаксис:
Поток карта (функция super T ? extends R>картограф)
2. филтър() : Филтърният метод се използва за избиране на елементи според предиката, подаден като аргумент.
Синтаксис:
Поток
филтър (предикат super T>предикат)
3. сортиран() : Сортираният метод се използва за сортиране на потока.
Синтаксис:
Поток
сортиран()
Потоксортиран (Comparator super T>компаратор)
4. flatMap(): Операцията flatMap в Java Streams се използва за изравняване на поток от колекции в единичен поток от елементи.
Синтаксис:
Поток flatMap(функция super T ? extends Stream extends R>> картограф)
5. различен() : Премахва дублирани елементи. Той връща поток, състоящ се от отделните елементи (според Object.equals(Object)).
Синтаксис:
Поток
различен() java формат низ
6. надникнете () : Извършва действие върху всеки елемент, без да променя потока. Той връща поток, състоящ се от елементите на този поток, като допълнително изпълнява предоставеното действие върху всеки елемент, тъй като елементите се консумират от резултантния поток.
Синтаксис:
Поток
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 за междинна проверка.
- събира (Collectors.toList()): Събира окончателно обработените низове в списък, наречен резултат.
Програмата отпечатва междинните резултати, съхранени в набора intermediateResults. Накрая той отпечатва списъка с резултати, който съдържа напълно обработените низове след всички поточни операции.
Терминални операции
Терминалните операции са типът операции, които връщат резултата. Тези операции не се обработват допълнително, а само връщат крайна резултатна стойност.
Важни операции на терминала
1. събирам() : Методът collect се използва за връщане на резултата от междинните операции, извършени в потока.
Синтаксис:
R collect(Колектор super T A R>колекционер)
2. forEach() : Методът forEach се използва за итерация през всеки елемент от потока.
Синтаксис:
void forEach(Потребител super T>действие)
3. намаляване (): Методът за намаляване се използва за намаляване на елементите на потока до една стойност. Методът за намаляване приема BinaryOperator като параметър.
Синтаксис:
T reduce(T identity BinaryOperator
акумулатор)
Не е задължителнонамали (двоичен оператор акумулатор)
4. брой() : Връща броя на елементите в потока.
Синтаксис:
дълго броене()
5. findFirst() : Връща първия елемент от потока, ако присъства.
Синтаксис:
Не е задължително
findFirst() глобални променливи js
6. allMatch() : Проверява дали всички елементи на потока съответстват на даден предикат.
Синтаксис:
boolean allMatch(Предикат super T>предикат)
7. Anymatch () : Проверява дали някой елемент от потока съответства на даден предикат.
Синтаксис:
Boolean 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 отговори
- За операции с бази данни
- Едновременна обработка