Что такое Java 8 Streams API? Java 8 Stream API
Разработчики могут выполнять широкий спектр операций над коллекциями, таких как фильтрация, сопоставление, сокращение и сортировка в декларативной форме. Это означает, что разработчики могут сосредоточиться на том, что они хотят сделать с данными, а не на том, как это сделать.
Поток создается путем вызова метода stream() на коллекции:Потоки позволяют
List<String> myList = Arrays.asList("apple", "banana", "cherry", "date", "strawberry", "orange", "blueberry"); Stream<String> myStream = myList.stream(); System.out.println(myStream);
Он печатает ссылку на объект ReferencePipeline$Head, который представляет собой голову конвейера потока. Эта ссылка не предоставляет никакой информации о данных в потоке, а скорее представляет собой начальную точку для серии операций обработки потока.
Включает имя класса, за которым следует хэш-код объекта.
java.util.stream.ReferencePipeline$Head@e9e54c2
Они возвращают новый поток, позволяя выполнять над ним дальнейшие операции.
Он позволяет фильтровать элементы потока на основе некоторого условия. Например, чтобы отфильтровать все элементы, начинающиеся с буквы "b" в потоке строк, можно использовать метод filter() следующим образом:
List<String> filteredList = myList.stream().filter(s -> s.startsWith("b")).collect(Collectors.toList());
Вывод:
[banana, blueberry]
2. map():
Преобразует элементы потока в другую форму.
Пример: Преобразуйте поток строк в поток их длин следующим образом:
List<Integer> mappedList = myList.stream().map(s -> s.length()).collect(Collectors.toList());
Вывод:
[5, 6, 6, 4, 10, 6, 9]
3. flatMap():
Применяет функцию к каждому элементу потока, в результате чего может получиться несколько элементов. Затем они сплющиваются в один поток.
Stream<String> stringStream = Stream.of("hello world", "welcome to Java"); List<String> flatMapList = stringStream.flatMap(str -> Stream.of(str.split(" "))).collect(Collectors.toList());
Вывод:
[hello, world, welcome, to, Java]
4. distinct():
Возвращает поток, состоящий из уникальных элементов исходного потока.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 1, 2, 5, 3, 6, 4); List<Integer> uniqueNumbers = numbers.stream() .distinct() .collect(Collectors.toList());
Вывод:
[1, 2, 3, 4, 5, 6]
5. sorted():
Сортирует элементы потока на основе некоторых критериев.
Завершить обработку потока и вернуть результат или побочный эффект.
List<String> sortedList = myList.stream().sorted().collect(Collectors.toList());
Вывод:
[apple, banana, blueberry, cherry, date, orange, strawberry]
Возвращает количество элементов в потоке.
2. reduce():Пример: Отсортировать поток строк в порядке возрастания:
Выход:
long count = myList.stream() .filter(s -> s.startsWith("b")) .count();
Терминальные операции
Они
T:
Например, собрать все элементы потока строк в список:
String result = myList.stream().reduce("", (s1, s2) -> s1 + s2);
Вывод:
applebananacherrydatestrawberryorangeblueberry
Например, собрать все элементы потока строк в список:
Например: конкатенировать все элементы потока строк в одну строку:
4. forEach()Он объединяет элементы потока в один результат.
List<String> myList = myStream.collect(Collectors.toList());
Вывод:
[apple, banana, cherry, date, strawberry, orange, blueberry]
Outpu
ForEach() - это терминальная операция, которая принимает Consumer и применяет его к каждому элементу потока. Она ничего не возвращает. Это метод пустоты.
Пример: мы используем ссылку на метод System.out::println в качестве потребителя для печати каждого элемента на консоль.
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date"); fruits.stream().forEach(System.out::println);
Вывод:
I like to eat apple I like to eat banana I like to eat cherry
5. findFirst()
Удовлетворяет определенному условию. Если найден подходящий элемент, возвращается объект Optional, содержащий этот элемент.
List<Integer> n = Arrays.asList(1, 3, 5, 7, 9, 11); Optional<Integer> r = n.stream().filter(number -> number > 5) .findFirst().get();
Вывод: 7
Поток не выполняет никаких операций, пока не будет вызвана терминальная операция (например, forEach(), collect() и др. ) не будет вызвана. Это означает, что промежуточные операции (filter(), map(), sorted() и др. ) выполняются только после вызова терминальной операции.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Stream<Integer> stream = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * n);
В этом случае промежуточными операциями являются filter() и map(), но поскольку не вызывается ни одна терминальная операция, поток не выполняет никакого кода. Поэтому операции filter() и map() считаются лениво загруженными.
Чтобы выполнить эти операции и получить результат, нам нужно вызвать терминальную операцию. Например, мы можем использовать метод forEach() для печати результирующего потока:
stream.forEach(System.out::println);
Вывод:
4 16 36 64 100
Теперь поток
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.