Java Stream Peek:窺探流中的數據元素

一、Stream簡介

在介紹Java Stream Peek之前,先需要了解Java Stream的概念。Java Stream是在Java 8之後引入的一種新的處理數據集合的方式,它可以更簡便、高效地操作集合中的數據。與傳統的集合操作方式相比,Java Stream可以提高性能和代碼可讀性。

Java Stream是一個表示任意元素序列的概念,它支持各種類型的數據源,例如List、Set、數組等,Stream操作可以分為中間操作和終端操作兩類。中間操作包括過濾、映射、排序、去重等操作,而終端操作包括forEach、count、collect等。

二、Stream Peek的作用

Stream Peek是Stream中的一個中間操作,它可以讓我們在Stream中執行一些診斷性的操作,例如打印出Stream中的元素、記錄日誌、計算執行時間等。Stream Peek可以幫助我們更好地了解Stream的數據流向,也可以在調試代碼時提供一些幫助。

Stream Peek的簽名如下:

Stream peek(Consumer action);

其中,action代表一個Consumer類型的函數式接口,它可以在Stream的每個元素上執行一些操作。

三、Stream Peek的使用場景

Stream Peek適用於以下一些場景:

1、觀察Stream的數據流向

在對Stream進行多個操作時,我們有時難以確定Stream中數據的真實狀態,即Stream中的元素究竟是什麼樣子的。此時,可以在每個中間操作之後插入一個peek操作,打印出當前Stream中的元素,以便我們觀察Stream的數據流向。例如:

List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon");
list.stream().filter(s -> s.length() > 5)
            .peek(s -> System.out.println("filter:" + s))
            .map(String::toUpperCase)
            .peek(s -> System.out.println("toUpperCase:" + s))
            .collect(Collectors.toList());

執行結果如下:

filter:orange
toUpperCase:ORANGE
filter:watermelon
toUpperCase:WATERMELON

打印出了Stream中經過過濾和映射之後的元素,以便我們更清楚地了解Stream的數據流向。

2、記錄日誌

在開發中,我們經常需要記錄一些日誌信息以便追蹤問題。Stream Peek可以方便地記錄一些Stream中的信息。例如,在以下的示例中,我們在Stream Peek中打印出當前處理的數字:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().peek(i -> System.out.println("processing:" + i))
            .map(i -> i * 2)
            .peek(i -> System.out.println("result:" + i))
            .collect(Collectors.toList());

執行結果如下:

processing:1
result:2
processing:2
result:4
processing:3
result:6
processing:4
result:8
processing:5
result:10  

可以看到,在Stream Peek中,我們輸出了每個數字的處理過程和結果,方便我們日後進行追蹤和調試。

四、Stream Peek的注意事項

當使用Stream Peek時,需要注意以下事項:

1、Stream Peek是中間操作

與終端操作不同,Stream Peek是中間操作,它不能打斷Stream的處理過程。如果在Stream Peek中拋出異常,那麼Stream的處理將會中斷。

2、Stream Peek不能修改Stream中的元素

Stream Peek只是對Stream中的元素進行一些操作,它不能修改Stream中的元素。如果需要對Stream進行修改,應該使用map等終端操作。

3、Stream Peek可以執行多次

與終端操作不同,Stream Peek是可以執行多次的,每次執行都會打印出當前Stream中的元素。例如:

List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon");
Stream<String> stream = list.stream();
stream.peek(s -> System.out.println("peek1:" + s))
            .filter(s -> s.length() > 5)
            .peek(s -> System.out.println("peek2:" + s))
            .map(String::toUpperCase)
            .peek(s -> System.out.println("peek3:" + s))
            .collect(Collectors.toList());
stream.peek(s -> System.out.println("peek4:" + s))
            .map(String::toLowerCase)
            .peek(s -> System.out.println("peek5:" + s))
            .collect(Collectors.toList());

執行結果如下:

peek1:apple
peek1:banana
peek1:orange
peek1:watermelon
peek2:watermelon
peek3:WATERMELON
peek2:orange
peek3:ORANGE
peek4:apple
peek4:banana
peek4:orange
peek4:watermelon
peek5:orange
peek5:watermelon
peek5:apple
peek5:banana

可以看到,在兩個不同的Stream中執行了多個peek操作。

五、代碼示例

以下為一個完整的Java Stream Peek的代碼示例:

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

public class StreamPeekExample {
    public static void main(String[] args) {
        // 觀察Stream的數據流向
        List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon");
        list.stream().filter(s -> s.length() > 5)
                .peek(s -> System.out.println("filter:" + s))
                .map(String::toUpperCase)
                .peek(s -> System.out.println("toUpperCase:" + s))
                .collect(Collectors.toList());

        // 記錄日誌
        List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5);
        list2.stream().peek(i -> System.out.println("processing:" + i))
                .map(i -> i * 2)
                .peek(i -> System.out.println("result:" + i))
                .collect(Collectors.toList());

        // 可以執行多次
        Stream<String> stream = list.stream();
        stream.peek(s -> System.out.println("peek1:" + s))
                .filter(s -> s.length() > 5)
                .peek(s -> System.out.println("peek2:" + s))
                .map(String::toUpperCase)
                .peek(s -> System.out.println("peek3:" + s))
                .collect(Collectors.toList());

        stream.peek(s -> System.out.println("peek4:" + s))
                .map(String::toLowerCase)
                .peek(s -> System.out.println("peek5:" + s))
                .collect(Collectors.toList());
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/308791.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-03 14:49
下一篇 2025-01-03 14:49

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29

發表回復

登錄後才能評論