Java 8 Stream Api 中的 peek 操作
1. 前言
我在 中講述了中 map
操作和 flatMap
操作的區別。然後有小夥伴告訴我 peek
操作 也能實現元素的處理。但是你知道 map
和 peek
的區別嗎? map
我們在開頭文章已經講過了,你可以去詳細瞭解一下它,本文將重點講解一下 peek
操作。
2. peek
peek
操作接收的是一個 Consumer<T>
函式。顧名思義 peek 操作會按照 Consumer<T>
函式提供的邏輯去消費流中的每一個元素,同時有可能改變元素內部的一些屬性。
這裡我們要提一下這個 Consumer<T>
以理解 什麼是消費。
2.1 什麼是消費 (Consumer)
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
的方式為兩種:
-
T 本身的 void 方法 比較典型的就是
setter
。 -
把 T 交給其它介面(類)的 void 方法進行處理 比如我們經常用的列印一個物件
System.out.println(T)
2.2 peek 操作演示
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 實際中我們會用於哪些場景呢?比如對 Collection<T>
中的 T
的某些屬性進行批處理的時候用 peek
操作就比較合適。 如果我們要從 Collection<T>
中獲取 T
的某個屬性的集合時用 map
也就最好不過了。
4. 總結
我們今天瞭解 Stream
的 peek
操作,同時也回顧了 Stream
的生命週期。也順帶對 Consumer<T>
函式進行了講解。而且 和 map
相互做了比較,對各自的使用場景又做了說明。相信看過本文後你對它們會有更深的理解。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2824310/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Stream中的Peek操作
- Java8中的Stream APIJavaAPI
- Java8中的 lambda 和Stream APIJavaAPI
- Java8的Stream API使用JavaAPI
- 【Java8新特性】面試官:談談Java8中的Stream API有哪些終止操作?Java面試API
- Java8 Stream常用API整理JavaAPI
- Java8新特性--Stream APIJavaAPI
- java8 Stream APi 入門JavaAPI
- java8Stream操作集錦Java
- Java 8 Stream API 轉換到 Kotlin 集合APIJavaAPIKotlin
- Java8 - Stream API快速入門JavaAPI
- Java 8 中Stream用法Java
- Java8之Stream常用操作方式Java
- java8 Stream流操作介紹Java
- 【Java8新特性】Stream API有哪些中間操作?看完你也可以吊打面試官!!JavaAPI面試
- Java 8 peek() 方法的一些疑惑Java
- Java8的stream流讓操作集合更容易Java
- Java8 的 Stream 流式操作之王者歸來Java
- Java8之Stream-強大的collect操作Java
- Java 8 Stream API: 深入理解與高效使用JavaAPI
- Java 8 StreamJava
- Java8之Stream流(三)縮減操作Java
- Java 10中Stream API不可變集合JavaAPI
- Java8 新特性 Stream流操作List集合 (二)Java
- Java8中Stream 的一些用法Java
- 【Java8新特性】關於Java8的Stream API,看這一篇就夠了!!JavaAPI
- 13. 尚矽谷_Java8新特性_Stream API 練習JavaAPI
- Java 8 新特性 StreamJava
- Java8——Stream流Java
- java 8 特性——stream流Java
- Java Stream API groupingBy()介紹JavaAPI
- Java 8中處理集合的優雅姿勢——StreamJava
- Java8 Stream流的合併Java
- Go語言實現的Java Stream APIGoJavaAPI
- Stream 的幾種中間操作
- Java 8 Stream並行流Java並行
- JAVA8-stream學習Java
- java .stream(). 使用介紹 Streams APIJavaAPI