最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8中Stream?API的peek()方法詳解及需要注意的坑

 更新時(shí)間:2024年06月06日 16:21:01   作者:不脫頂?shù)某绦騿T小王  
這篇文章主要給大家介紹了關(guān)于Java8中Stream?API的peek()方法詳解及需要注意的坑,Java 中的 peek 方法是 Java 8 中的 Stream API 中的一個(gè)方法,它屬于中間操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

引言

在Java 8中,Stream API引入了許多強(qiáng)大的函數(shù)式編程特性,極大地增強(qiáng)了我們對(duì)集合數(shù)據(jù)進(jìn)行操作的能力。其中一個(gè)很有用的方法就是peek(),本文將詳細(xì)介紹其功能及應(yīng)用場(chǎng)景。

peek() 方法簡(jiǎn)介

peek() 是Java 8 Stream API中的一個(gè)中間操作方法,它的主要功能是對(duì)流中的每個(gè)元素執(zhí)行一個(gè)操作(可以是獲取、修改或打印等),而不影響流的整體處理流程。這意味著即使使用了peek(),流也可以繼續(xù)進(jìn)行后續(xù)的映射、過(guò)濾或其他操作。

<T> Stream<T> peek(Consumer<? super T> action);

參數(shù)action是一個(gè)Consumer接口的實(shí)現(xiàn),它接受一個(gè)泛型參數(shù)T,并對(duì)其執(zhí)行某種操作。

示例一:簡(jiǎn)單使用 peek() 打印元素()

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class PeekExample {
    public static void main(String[] args) {
        List<String> addrList = Arrays.asList("AAA");

        addrList.stream()
                .filter(Objects::nonNull)
                .peek(info -> {
                    System.out.println("Processing Element: " + info);
                }).collect(Collectors.toList());

        // 輸出:Processing Element: AAA
    }
}

在這個(gè)例子中,我們首先創(chuàng)建了一個(gè)包含一個(gè)元素"AAA"的列表,并將其轉(zhuǎn)換為流。隨后使用filter()方法去除可能存在的空元素(在此例中其實(shí)無(wú)需過(guò)濾,因?yàn)橐阎夭粸榭眨?。關(guān)鍵在于peek()方法的應(yīng)用,它接收一個(gè)lambda表達(dá)式,每當(dāng)流中的元素被訪問(wèn)時(shí),就執(zhí)行該表達(dá)式,從而實(shí)現(xiàn)了打印當(dāng)前處理元素的功能。

有坑的點(diǎn):刪除流終止操作,將會(huì)不執(zhí)行。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class PeekExample {
    public static void main(String[] args) {
        List<String> addrList = Arrays.asList("AAA");

        addrList.stream()
                .filter(Objects::nonNull)
                .peek(info -> {
                    System.out.println("Processing Element: " + info);
                });
        // 輸出:
    }
}

這段代碼中peek不會(huì)被執(zhí)行,并且不會(huì)打印。

peek()方法是 Strean 接口中的一個(gè)中間操作,它允許你在流的每 個(gè)元素上執(zhí)行一個(gè)操作,但是這個(gè)操作是在最終的終端操作(如
forEach,collect,limit 等)執(zhí)行 前進(jìn)行的。 然而,如果 peek()是流中唯一的操作,那么它實(shí)際上不會(huì)執(zhí)行。這是因?yàn)?br />peek ()本身并不是一個(gè) 終端操作,它不會(huì)觸發(fā)流的執(zhí)行。在 jav 8 及以后的版本中,流的執(zhí)行是情性的,這意味著流操作
不會(huì)立即執(zhí)行,而是在遇到終端操作時(shí)才會(huì)實(shí)際執(zhí)行

示例二:結(jié)合 peek() 進(jìn)行調(diào)試

peek()方法的一個(gè)常見(jiàn)用途是在調(diào)試時(shí)查看流中的元素狀態(tài),而不會(huì)影響到流的最終處理結(jié)果。

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
numbers.map(n -> n * 2) // 將每個(gè)數(shù)乘以2
       .peek(n -> System.out.println("Mapped value: " + n))
       .filter(n -> n % 3 == 0) // 過(guò)濾出能被3整除的數(shù)
       .peek(n -> System.out.println("Filtered value: " + n))
       .collect(Collectors.toList()); // 收集到List中

在上述代碼中,我們?cè)谟成浜瓦^(guò)濾操作之間插入了兩次peek(),分別用來(lái)查看映射后的值和過(guò)濾后的值,這對(duì)于理解流的處理過(guò)程非常有幫助。

總結(jié)起來(lái),peek()方法就像是一個(gè)觀察者,可以在不影響流整體處理的情況下,讓我們有機(jī)會(huì)在每個(gè)元素上執(zhí)行一些額外的操作,例如日志記錄、臨時(shí)計(jì)算、調(diào)試信息打印等。但它并不改變流的原始內(nèi)容,也不決定流的最終輸出結(jié)果。要得到流的處理結(jié)果,還需要進(jìn)一步調(diào)用諸如collect()forEach()reduce()等終端操作方法。

需要注意的坑

坑一:peek() 不影響流的生成和消費(fèi)

peek()是一個(gè)中間操作,它并不會(huì)終止流的處理流程,因此如果不跟一個(gè)終端操作(如collect(), forEach(), count()等),則peek()中的操作雖然會(huì)被執(zhí)行,但整個(gè)流式處理鏈的結(jié)果不會(huì)有任何產(chǎn)出。換言之,只有當(dāng)流被消耗時(shí),peek()里的操作才會(huì)真正發(fā)生。

坑二:peek() 的執(zhí)行次數(shù)取決于下游操作

peek()方法中的動(dòng)作會(huì)在流的每個(gè)元素上執(zhí)行一次,但具體執(zhí)行多少次取決于下游的終端操作。例如,如果你在排序(sorted())前使用了peek(),而在排序后又使用了一次peek(),則同一個(gè)元素可能會(huì)被兩次peek()。

坑三:并發(fā)流中的peek()行為

對(duì)于并行流,peek()操作的執(zhí)行順序沒(méi)有保證,而且可能會(huì)多次執(zhí)行(取決于JVM的具體調(diào)度)。如果你在并行流中依賴peek()的順序性或唯一性,可能會(huì)遇到意想不到的問(wèn)題。

坑四:資源管理

如果在peek()中打開(kāi)了一些資源(如文件、數(shù)據(jù)庫(kù)連接等),但在peek()內(nèi)部并未妥善關(guān)閉它們,可能會(huì)導(dǎo)致資源泄露。因?yàn)樵跊](méi)有終端操作的情況下,流可能不會(huì)立即執(zhí)行,資源也就無(wú)法及時(shí)釋放。

坑五:對(duì)流元素的修改可能無(wú)效

peek()通常用于讀取或打印流元素,而不是修改它們。雖然理論上可以嘗試在peek()中修改元素,但由于流的惰性求值和可能的不可變性,這樣的修改可能不會(huì)反映到源集合或后續(xù)流操作中。

總結(jié)

到此這篇關(guān)于Java8中Stream API的peek()方法詳解及需要注意的坑的文章就介紹到這了,更多相關(guān)Java8 Stream API的peek()方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解

    SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解

    IDEA 全稱 IntelliJ IDEA,是java編程語(yǔ)言的集成開(kāi)發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開(kāi)發(fā)工具,尤其在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說(shuō)是超常的
    2022-07-07
  • Spring處理@Async導(dǎo)致的循環(huán)依賴失敗問(wèn)題的方案詳解

    Spring處理@Async導(dǎo)致的循環(huán)依賴失敗問(wèn)題的方案詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中的@Async導(dǎo)致循環(huán)依賴失敗的原因及其解決方案,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • 解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    這篇文章主要介紹了解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot集成Dufs通過(guò)WebDAV實(shí)現(xiàn)文件管理方式

    SpringBoot集成Dufs通過(guò)WebDAV實(shí)現(xiàn)文件管理方式

    文章介紹了在SpringBoot應(yīng)用中集成Dufs文件服務(wù)器的方法,使用WebDAV協(xié)議實(shí)現(xiàn)文件管理功能,具體步驟包括添加項(xiàng)目依賴、配置類實(shí)現(xiàn)、服務(wù)層和控制器層的構(gòu)建,文章還詳細(xì)講解了大文件分塊上傳、異步操作和性能優(yōu)化措施
    2025-09-09
  • Java多線程中的wait、notify和park、unpark的使用詳解

    Java多線程中的wait、notify和park、unpark的使用詳解

    這篇文章主要介紹了Java多線程中的wait、notify和park、unpark的使用詳解,它們都是線程之間進(jìn)行協(xié)作的手段,都屬于 Object 對(duì)象的方法,必須獲得此對(duì)象的鎖,才能調(diào)用這幾個(gè)方法,需要的朋友可以參考下
    2023-12-12
  • Rabbitmq中的channel接口常用方法詳解

    Rabbitmq中的channel接口常用方法詳解

    這篇文章主要介紹了Rabbitmq中的channel接口常用方法詳解,為了確保消息一定被消費(fèi)者處理,rabbitMQ提供了消息確認(rèn)功能,就是在消費(fèi)者處理完任務(wù)之后,就給服務(wù)器一個(gè)回饋,服務(wù)器就會(huì)將該消息刪除,需要的朋友可以參考下
    2023-09-09
  • springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn)

    springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn)

    本文主要介紹了springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • SpringBoot+?Sharding?Sphere?輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段加解密功能

    SpringBoot+?Sharding?Sphere?輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段加解密功能

    在Spring?Boot生態(tài)中,有一個(gè)非常厲害的開(kāi)源框架:Apache?ShardingSphere,它是一款分布式?SQL?事務(wù)和查詢引擎,可通過(guò)數(shù)據(jù)分片、彈性伸縮、加密等能力對(duì)任意數(shù)據(jù)庫(kù)進(jìn)行增強(qiáng),今天通過(guò)這篇文章,我們一起來(lái)了解一下如何在?Spring?Boot?中快速實(shí)現(xiàn)數(shù)據(jù)的加解密功能
    2024-07-07
  • java中日期格式化的大坑

    java中日期格式化的大坑

    這篇文章主要介紹了java中日期格式化的大坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 給Java文件打成獨(dú)立JAR包的詳細(xì)步驟記錄

    給Java文件打成獨(dú)立JAR包的詳細(xì)步驟記錄

    這篇文章主要介紹了給Java文件打成獨(dú)立JAR包的相關(guān)資料,文中將Java文件打包成獨(dú)立的JAR包,包括非Maven和Maven項(xiàng)目的打包步驟,需要的朋友可以參考下
    2024-12-12

最新評(píng)論

齐齐哈尔市| 泊头市| 灵山县| 桦川县| 阳东县| 维西| 龙南县| 于田县| 汤原县| 邳州市| 平邑县| 武陟县| 巨野县| 茌平县| 许昌市| 封丘县| 临邑县| 武隆县| 西乌| 大城县| 临西县| 广宁县| 宁强县| 汉川市| 枞阳县| 崇仁县| 宝应县| 娄烦县| 鲁甸县| 潼关县| 温泉县| 托克逊县| 盐山县| 大荔县| 开封市| 虹口区| 瓮安县| 积石山| 兴安县| SHOW| 鄢陵县|