欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

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

peek() 方法簡介

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

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

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

示例一:簡單使用 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
    }
}

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

有坑的點:刪除流終止操作,將會不執(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不會被執(zhí)行,并且不會打印

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

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

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

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
numbers.map(n -> n * 2) // 將每個數(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中

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

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

需要注意的坑

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

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

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

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

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

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

坑四:資源管理

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

坑五:對流元素的修改可能無效

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

總結(jié)

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

相關(guān)文章

  • spring?boot項目使用@Async注解的坑

    spring?boot項目使用@Async注解的坑

    這篇文章主要為大家介紹了spring?boot項目中使用@Async注解遇到的坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 詳解java中動態(tài)代理實現(xiàn)機制

    詳解java中動態(tài)代理實現(xiàn)機制

    這篇文章主要為大家介紹了java中動態(tài)代理實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Eclipse創(chuàng)建JavaWeb工程的完整步驟記錄

    Eclipse創(chuàng)建JavaWeb工程的完整步驟記錄

    很多新手不知道Eclipse怎么創(chuàng)建Java Web項目,一起來看看吧,這篇文章主要給大家介紹了關(guān)于Eclipse創(chuàng)建JavaWeb工程的完整步驟,需要的朋友可以參考下
    2023-10-10
  • 編寫Java代碼對HDFS進行增刪改查操作代碼實例

    編寫Java代碼對HDFS進行增刪改查操作代碼實例

    這篇文章主要介紹了Java代碼對HDFS進行增刪改查操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java 照片對比功能的實現(xiàn)

    Java 照片對比功能的實現(xiàn)

    這篇文章主要介紹了Java 照片比對功能實現(xiàn)類的示例代碼,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-12-12
  • Spring的@RequestParam對象綁定方式

    Spring的@RequestParam對象綁定方式

    這篇文章主要介紹了Spring的@RequestParam對象綁定方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java多線程編程中的并發(fā)安全問題及解決方法

    Java多線程編程中的并發(fā)安全問題及解決方法

    保障多線程并發(fā)安全,解決線程同步與鎖競爭問題,提高應用性能與可靠性。多線程編程需要考慮線程安全性,使用同步機制保證共享變量的一致性,避免線程競爭導致的數(shù)據(jù)不一致與死鎖等問題。常用的同步機制包括synchronized、ReentrantLock、volatile等
    2023-04-04
  • 使用Feign實現(xiàn)微服務間文件下載

    使用Feign實現(xiàn)微服務間文件下載

    這篇文章主要為大家詳細介紹了使用Feign實現(xiàn)微服務間文件下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java設(shè)計模式之外觀模式

    Java設(shè)計模式之外觀模式

    這篇文章介紹了Java設(shè)計模式之外觀模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • java實現(xiàn)遞歸菜單樹

    java實現(xiàn)遞歸菜單樹

    這篇文章主要為大家詳細介紹了java實現(xiàn)遞歸菜單樹,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論