операция просмотра в Java 8 Stream Api

Spring Boot Java

1. Введение

я здесьmap и flatMap в Java 8 Stream APIсказал вJava8 Stream APIсерединаmapоперация иflatMapразница в эксплуатации. Потом друг сказал мнеpeekОперации также могут реализовывать обработку элементов. но ты знаешьmapиpeekразница?mapМы уже говорили об этом в начале статьи, вы можете узнать об этом подробнее, эта статья будет посвящена объяснениюpeekработать.

2. peek

peekОперация получаетConsumer<T>функция. Как следует из названия, операция просмотра будет следовать заConsumer<T>Функция предоставляет логику для использования каждого элемента в потоке, возможно, изменяя некоторые свойства внутри элемента. Здесь мы упоминаем об этомConsumer<T>понять, что такое потребление.

2.1 Что такое потребление (Потребитель)

package java.util.function;

import java.util.Objects;

 
@FunctionalInterface
public interface Consumer<T> {
 
    void accept(T t);

     // 嵌套accept , 顺序为先执行 accept 后执行参数里的 after.accpet
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
 }

Consumer<T>это функциональный интерфейс. абстрактный методvoid accept(T t)принятьTвведите параметры и используйте их. На самом деле ощущение потребления для меня "израсходовано", а естественная отдача -void. Обычно "израсходовано"TЕсть два способа:

  • void метод самого TЭто более характерноsetter.
  • Дайте T для удаления методов других интерфейсов (классов) для обработкиНапример, мы часто используем для печати объектаSystem.out.println(T)

2.2 демонстрация операции просмотра

 Stream<String> stream = Stream.of("hello", "felord.cn");
   stream.peek(System.out::println);

Если вы протестируете приведенный выше код, вы обнаружите, что он вообще не работает логически. Почему это? Это связано с тем, что жизненный цикл потока состоит из трех фаз:

  • Начать этап сборки.
  • Промежуточные операции извлекают элементы один за другим и обрабатывают их. По желанию.Все промежуточные операции ленивы, поэтому ни одна операция не имеет никакого эффекта, пока поток не пройдет через конвейер.
  • Терминальная операция. обычно делится наконечное потребление(foreachи т. д.) ииндукция(collect) две категории. Еще одним важным моментом является то, что операция терминала запускает поток потока в конвейере.

Поэтому его следует изменить на следующее:

 Stream<String> stream = Stream.of("hello", "felord.cn");
  List<String> strs= stream.peek(System.out::println).collect(Collectors.toLIst());

Например, на изображении ниже мы добавляем рамку к сфере:

3. peek VS map

peekОперация обычно используется, когда вы не хотите изменять тип самого элемента в потоке или хотите только манипулировать внутренним состоянием элемента; иmapОн используется для изменения типа самого элемента в потоке, то есть для вывода из элемента другого типа операции. Это самая большая разница между ними. Итак, для каких сценариев мы на самом деле используем peek? например правильноStream<T>серединаTНекоторые свойства пакета используются при пакетированииpeekоперация более уместна. Если бы мы началиStream<T>получено вTиспользуется, когда набор свойствmapДаже лучше.

4. Резюме

мы понимаем сегодняStreamизpeekоперации, а также рассмотретьStreamжизненный цикл. тоже кстатиConsumer<T>объясняются функции. и иmapОни сравнили друг с другом и объяснили свои соответствующие сценарии использования. Я верю, что после прочтения этой статьи вы будете иметь более глубокое представление о них.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn