Что такое 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
Теперь поток
19.03.2023 13:43
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...
19.03.2023 13:03
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после поставщика контекста. Это позволит избежать ненужных повторных рендеров.
19.03.2023 11:50
Лично я попрощался с операторами print() в python. Без шуток.
19.03.2023 06:15
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они постоянно обновляют версию (а нам нужно быстро наверстать упущенное!).
18.03.2023 11:32
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
18.03.2023 11:16
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки наряду с HTML и JavaScript.