java中stream的peek()用法詳解
改變?cè)氐膬?nèi)部狀態(tài),對(duì)每個(gè)object執(zhí)行 saveInfomation(object, params),然后把結(jié)果收集到一個(gè) List 里,這里涉及到了最終操作,需要的朋友可以參考下
前言
最近看到一段代碼:
aeFormList.stream().peek(object -> saveInfomation(object, params)).collect(Collectors.toList());
之前沒有用過peek,于是查了一下,peek的作用是:
改變?cè)氐膬?nèi)部狀態(tài)
從這句話中可以看出,上面代碼的意思是:對(duì)每個(gè)object執(zhí)行 saveInfomation(object, params),然后把結(jié)果收集到一個(gè) List 里。 這里涉及到了最終操作。
最終操作(terminal operation)
peek() 并不是一個(gè)最終操作(terminal operation)。stream 被設(shè)計(jì)為“元素只有在最終操作需要時(shí)才會(huì)被處理”。如果沒有最終操作的“拉動(dòng)”,那么 stream 中就沒有操作會(huì)真正執(zhí)行。
在上面的例子中,.collect(Collectors.toList())就是一個(gè)最終操作,而且這個(gè)操作會(huì)“拉動(dòng)”所有元素。這樣一來,每個(gè)元素都一定會(huì)被應(yīng)用 peek() 方法。
但在使用 peek() 時(shí)仍然需要注意,因?yàn)樗槐WC作用于流經(jīng)管道的元素,但并不保證全部元素都會(huì)流經(jīng)管道。
peek() vs forEach()
forEach() 則是一個(gè)最終操作。除此之外,peek() 和 forEach() 再無其他不同。
那么到底什么是最終操作,我們看如下代碼:
使用了forEach()之后,在結(jié)尾使用.collect方法會(huì)報(bào)錯(cuò)。因?yàn)閒orEach() 已經(jīng)是一個(gè)最終操作無法再添加最終操作。

在使用peek()之后,可以使用.collect方法。

peek() 的典型用法:協(xié)助調(diào)試
正因?yàn)?peek() 不是一個(gè)最終操作,不會(huì)影響“哪些元素會(huì)流過”,所以十分適合在調(diào)試的時(shí)候,用來打印出流經(jīng)管道的元素。例如:
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
總結(jié)
- 如果想對(duì)流經(jīng)的每個(gè)元素應(yīng)用一個(gè)函數(shù),從而改變某些狀態(tài),那么請(qǐng)用 forEach();
- 如果想打印流經(jīng)的每個(gè)元素的狀態(tài)(日志或 debug),這時(shí)應(yīng)該用 peek();
到此這篇關(guān)于java中stream的peek()用法詳解的文章就介紹到這了,更多相關(guān)stream的peek()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java前端實(shí)現(xiàn)發(fā)送date類型的參數(shù)給后端
這篇文章主要介紹了Java前端實(shí)現(xiàn)發(fā)送date類型的參數(shù)給后端方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式
這篇文章主要介紹了Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題
這篇文章主要介紹了解決@CachePut設(shè)置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
將SpringBoot的Jar注冊(cè)成Windows服務(wù)的實(shí)現(xiàn)方法
當(dāng)前項(xiàng)目有個(gè)地圖編輯器,后端用的是SpringBoot框架,外網(wǎng)剛好有一臺(tái)空閑的Windows服務(wù)器就直接拿來用了,將Java程序部署成Windows服務(wù)可以用WinSW (Windows Service Wrapper)來實(shí)現(xiàn),文中有詳細(xì)的操作步驟,需要的朋友可以參考下2023-11-11
Java實(shí)現(xiàn)遞歸讀取文件夾下的所有文件
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)遞歸讀取文件夾下的所有文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

