国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 8 Stream API 中的 peek() 方法詳解,以及需要注意的坑。

這篇具有很好參考價(jià)值的文章主要介紹了Java 8 Stream API 中的 peek() 方法詳解,以及需要注意的坑。。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

震驚 java一個(gè)大坑, 被老板約談了。

引言

在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ù)的映射、過濾或其他操作。

<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í)無需過濾,因?yàn)橐阎夭粸榭眨?。關(guān)鍵在于peek()方法的應(yīng)用,它接收一個(gè)lambda表達(dá)式,每當(dāng)流中的元素被訪問時(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è)常見用途是在調(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) // 過濾出能被3整除的數(shù)
       .peek(n -> System.out.println("Filtered value: " + n))
       .collect(Collectors.toList()); // 收集到List中

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

總結(jié)起來,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í)行順序沒有保證,而且可能會(huì)多次執(zhí)行(取決于JVM的具體調(diào)度)。如果你在并行流中依賴peek()的順序性或唯一性,可能會(huì)遇到意想不到的問題。

坑四:資源管理

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

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

peek()通常用于讀取或打印流元素,而不是修改它們。雖然理論上可以嘗試在peek()中修改元素,但由于流的惰性求值和可能的不可變性,這樣的修改可能不會(huì)反映到源集合或后續(xù)流操作中。文章來源地址http://www.zghlxwxcb.cn/news/detail-853112.html

到了這里,關(guān)于Java 8 Stream API 中的 peek() 方法詳解,以及需要注意的坑。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 空文件夾刪不掉打不開,“該項(xiàng)目不存在請(qǐng)確認(rèn)該項(xiàng)目位置“,“項(xiàng)目正在打開中無法刪除“,“文件已損壞或者已經(jīng)被移動(dòng)刪除“(多種方法圖文詳解,細(xì)節(jié)需要注意,以及可能遇到的問題)

    空文件夾刪不掉打不開,“該項(xiàng)目不存在請(qǐng)確認(rèn)該項(xiàng)目位置“,“項(xiàng)目正在打開中無法刪除“,“文件已損壞或者已經(jīng)被移動(dòng)刪除“(多種方法圖文詳解,細(xì)節(jié)需要注意,以及可能遇到的問題)

    這個(gè)刪不掉的文件或文件夾其實(shí)是Windows系統(tǒng)的祖?zhèn)鱞ug到目前為止依然沒有修復(fù),所以說我們需要通過特別的手段來處理它,聽我慢慢講他的緣由可能會(huì)對(duì)解決這個(gè)問題的幫助更多,會(huì)有幾種方法,我都試過了的,我把最后一種成功的放在第一個(gè)講,沒有成功的可以參考。 事情緣由因

    2024年02月06日
    瀏覽(95)
  • Java Stream中的API你都用過了嗎?

    公眾號(hào)「架構(gòu)成長(zhǎng)指南」,專注于生產(chǎn)實(shí)踐、云原生、分布式系統(tǒng)、大數(shù)據(jù)技術(shù)分享。 在本教程中,您將通過大量示例來學(xué)習(xí) Java 8 Stream API。 Java 在 Java 8 中提供了一個(gè)新的附加包,稱為 java.util.stream 。該包由類、接口和枚舉組成,允許對(duì)元素進(jìn)行函數(shù)式操作。 您可以通過在

    2024年02月05日
    瀏覽(23)
  • Java Stream API的基本使用方法

    Java Stream API的基本使用方法

    Java各個(gè)版本所更新的主要內(nèi)容: 1.Java SE 8:引入了一些新特性,如lambda表達(dá)式、Stream API、格式化日期、國(guó)際化等。此外,還對(duì)并發(fā)編程進(jìn)行了改進(jìn),引入了線程安全的 Stream API 。 2.Java SE 9:新增了分布式架構(gòu)的支持,引入了CompletableFuture、ZK等新特性。此外,還對(duì)Jit編譯器進(jìn)

    2024年02月03日
    瀏覽(31)
  • Java 8及以上新特性:Lambda表達(dá)式、Stream API、Optional類與接口默認(rèn)方法(四)

    目錄 一、接口默認(rèn)方法 1.1 概念解析: 1.2 應(yīng)用場(chǎng)景: 1.3 使用注意事項(xiàng): 1.4 使用示例: 二、結(jié)論 1.1 總結(jié)Java 8及以上版本四大新特性的重要意義與價(jià)值: 1.2 鼓勵(lì)讀者積極學(xué)習(xí)并運(yùn)用這些新特性: 1.3 對(duì)未來Java版本可能引入的新特性進(jìn)行展望: 1.1 概念解析: 接口默認(rèn)方法

    2024年04月13日
    瀏覽(30)
  • 使用Java8 Stream流中的Collectors.collectingAndThen()方法去重

    Collectors.collectingAndThen() 根據(jù)對(duì)象屬性進(jìn)行去重操作 Collectors.collectingAndThen()方法屬于java8 Stream流中的 java.util.stream.Collectors ,此類實(shí)現(xiàn)了 java.util.stream.Collector 接口,還提供了大量的方法對(duì)Stream流中的元素進(jìn)行 map 和 reduce 操作 在獲取任務(wù)的時(shí)候,會(huì)出現(xiàn)id重復(fù)的狀況,利用 Co

    2024年02月09日
    瀏覽(103)
  • api接口怎么對(duì)接?你只需要注意這4點(diǎn)

    原則上API接口設(shè)計(jì)一般出現(xiàn)在開發(fā)的詳細(xì)設(shè)計(jì)中,但是隨著諸多公司建立開放平臺(tái),產(chǎn)品經(jīng)理也逐漸需要能理解API接口,尤其是做平臺(tái)性的產(chǎn)品,還要學(xué)會(huì)定義接口。本文就關(guān)于產(chǎn)品經(jīng)理在設(shè)計(jì)接口中需要定義什么、需要注意什么來展開陳述。 一、了解API的常識(shí) 在做接口設(shè)

    2024年02月04日
    瀏覽(24)
  • Python 中的 multiprocessing 模塊和 threading 模塊有什么區(qū)別?什么情況下應(yīng)該使用哪一個(gè)?解釋 Python 中的 __del__ 方法的作用。有什么需要注意的地方解釋

    multiprocessing 模塊和 threading 模塊都是用于在 Python 中進(jìn)行并發(fā)編程的工具,但它們有一些關(guān)鍵的區(qū)別。以下是它們之間的比較: 區(qū)別: 并行性 vs 并發(fā)性: multiprocessing 模塊用于創(chuàng)建獨(dú)立的進(jìn)程,每個(gè)進(jìn)程都有自己的 Python 解釋器和全局解釋器鎖(GIL)。因此,multiprocessing 允許

    2024年02月22日
    瀏覽(31)
  • Java對(duì)文件的寫入和讀取 (File類詳解以及Input,OutputStream用法,注意事項(xiàng))

    Java對(duì)文件的寫入和讀取 (File類詳解以及Input,OutputStream用法,注意事項(xiàng))

    Java中,操作文件的類有很多, 核心的部分是File類,InputStream,OutputStream類 我們先來看看 File 類中的常見屬性、構(gòu)造方法和方法 屬性 修飾符及類型 屬性 說明 static String pathSeparator 依賴于系統(tǒng)的路徑分隔符,String 類型的表示 static char pathSeparator 依賴于系統(tǒng)的路徑分隔符,char 類型的

    2024年02月09日
    瀏覽(20)
  • 前端開發(fā)中需要注意的CSS命名規(guī)則以及書寫順序

    1、CSS的命名——BEM規(guī)則: CSS命名一般是用 BEM 規(guī)則命名的。它背后的想法是將用戶界面劃分為獨(dú)立的塊。 BEM 的意思就是 B模塊(block) 、 E元素(element) 、 M修飾符(modifier) , 即: [block]__[element]--[modifier] 。 模塊和子元素之間用兩個(gè)下劃線分隔(如:order__security),子元素和修飾

    2024年02月01日
    瀏覽(26)
  • 【筆記】Arrays.binarySearch()實(shí)踐,以及需要注意的一些問題點(diǎn)

    【筆記】Arrays.binarySearch()實(shí)踐,以及需要注意的一些問題點(diǎn)

    背景:我想校驗(yàn)一個(gè)指定的String字符串,是否存在于另一個(gè)String數(shù)組中,選擇 Arrays.binarySearch() 方法實(shí)現(xiàn),代碼如下: 運(yùn)行結(jié)果: 很直觀的能看到item數(shù)組里面存在字符串 1591 ,為什么程序運(yùn)行的結(jié)果卻是找不到該元素呢? 首先來看一下源碼: 注意,注釋上提到了兩個(gè)重點(diǎn):

    2024年02月06日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包