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

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

peek() 的典型用法:協(xié)助調(diào)試
正因為 peek() 不是一個最終操作,不會影響“哪些元素會流過”,所以十分適合在調(diào)試的時候,用來打印出流經(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é)
- 如果想對流經(jīng)的每個元素應用一個函數(shù),從而改變某些狀態(tài),那么請用 forEach();
- 如果想打印流經(jīng)的每個元素的狀態(tài)(日志或 debug),這時應該用 peek();
到此這篇關(guān)于java中stream的peek()用法詳解的文章就介紹到這了,更多相關(guān)stream的peek()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java前端實現(xiàn)發(fā)送date類型的參數(shù)給后端
這篇文章主要介紹了Java前端實現(xiàn)發(fā)送date類型的參數(shù)給后端方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式
這篇文章主要介紹了Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
解決@CachePut設置的key值無法與@CacheValue的值匹配問題
這篇文章主要介紹了解決@CachePut設置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
解決IDEA使用springBoot創(chuàng)建項目,lombok標注實體類后編譯無報錯,但是運行時報錯問題
文章詳細描述了在使用lombok的@Data注解標注實體類時遇到編譯無誤但運行時報錯的問題,分析了可能的原因,并提供了解決步驟2025-01-01
將SpringBoot的Jar注冊成Windows服務的實現(xiàn)方法
當前項目有個地圖編輯器,后端用的是SpringBoot框架,外網(wǎng)剛好有一臺空閑的Windows服務器就直接拿來用了,將Java程序部署成Windows服務可以用WinSW (Windows Service Wrapper)來實現(xiàn),文中有詳細的操作步驟,需要的朋友可以參考下2023-11-11

