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获取更多资讯