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

Stream中的Peek操作代碼

 更新時間:2023年09月26日 10:07:35   作者:自律的西瓜L  
這篇文章主要介紹了Stream中的Peek操作,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

peek()是一個Intermediate操作,它接收一個Consumer類型的lambda參數(shù)(void類型),對每個元素執(zhí)行操作并返回一個新的Stream,并可以繼續(xù)進行流的操作。peek()方法不會影響原始流中的元素。

1.引言

       如果你試圖對流操作中的流水線進行調(diào)試, 了解stream流水線每個操作之前和操作之后的中間值, 該如何去做?

       首先我們看一個例子, 使用forEach將流操作的結(jié)果打印出來.

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekTestOne {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(4, 7, 9, 11, 12);
        list.stream()
                .map(x -> x + 2)
                .filter(x -> x % 2 != 0)
                .limit(2)
                .forEach(System.out::println);
    }
}
輸出結(jié)果如下:
9
11

       可以很明顯的看出, 一旦調(diào)用了forEach操作, 整個流就會恢復運行.并不能很好的幫助我們了解Stream流水線中的每個操作(如:map,filter,limit等)產(chǎn)生的輸出.

       再來看一個例子

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekTestTwo {
    public static void main(String[] args) {
        Stream<Integer> stream = Arrays.asList(4, 7, 9, 11, 12).stream();
        stream.peek(System.out::println);
    }
}
這段代碼是想打印stream中的值,卻沒有任何輸出.

2.中間操作和終止操作

       中間操作是流水線中的數(shù)據(jù)進行加工的, 它是一個懶操作, 并不會馬上執(zhí)行, 需要等待有終止操作的時候才會執(zhí)行.

       終止操作是Stream的啟動操作, 當有終止操作的時候, Stream才會真正的開始執(zhí)行.

       因此, 這里可以解釋上面的peek操作是一個中間操作, 所以沒有任何輸出.

3.使用peek進行debug操作

       peek的設(shè)計初衷就是在流的每個元素恢復運行之前的時候插入一個執(zhí)行操作. 它不想forEach那樣恢復整個流的運行操作. 而是在一個元素上完成操作之后, 它只會將操作順承到流水線的下一個操作. 它能夠?qū)⒅虚g變量的值輸出到日志. 有效的幫助我們了解流水線的每一步操作的輸出值.如下圖:

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekTestThree {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(4, 7, 9, 11, 12);
        list.stream()
                .peek(x -> System.out.println("stream: " + x))
                .map(x -> x + 2)
                .peek(x -> System.out.println("map: " + x))
                .filter(x -> x % 2 != 0)
                .peek(x -> System.out.println("filter: " + x))
                .limit(2)
                .peek(x -> System.out.println("limit: " + x))
                .collect(toList());
    }
}
輸出結(jié)果如下:
stream: 4
map: 6
stream: 7
map: 9
filter: 9
limit: 9
stream: 9
map: 11
filter: 11
limit: 11
Process finished with exit code 0

4.peek和map的區(qū)別

  使用peek操作流,流中的元素沒有改變。

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekAndMapTestOne {
    public static void main(String[] args) {
        Arrays.asList("a","b")
                .stream()
                .peek(x -> x.toUpperCase())
                .forEach(System.out::println);
    }
}
輸出:
a
b
Process finished with exit code 0

  使用map操作流,流中的元素有改變。

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekAndMapTestTwo {
    public static void main(String[] args) {
        Arrays.asList("a","b")
                .stream()
                .map(x -> x.toUpperCase())
                .forEach(System.out::println);
    }
}
輸出:
A
B
Process finished with exit code 0

  可以通過上面兩個例子看出,map操作是對元素進行了轉(zhuǎn)換。

  注意:peek對一個對象進行操作的時候,對象不變,但是可以改變對象里面的值.如下:

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
@Getter
@Setter
@AllArgsConstructor
@ToString
public class Person {
    private String id;
    private String name;
}
----------------------------------------------------------------------------
/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/5/28
 */
public class PeekAndMapTestThree {
    public static void main(String[] args) {
        Arrays.asList(new Person("001","zs"),new Person("002","ls"))
                .stream().peek(p -> p.setId("000")).forEach(System.out::println);
    }
}
輸出:
Person(id=000, name=zs)
Person(id=000, name=ls)
Process finished with exit code 0

  peek的定義

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

        peek方法接收一個Consumer的入?yún)? 了解λ表達式的應(yīng)該明白 Consumer的實現(xiàn)類應(yīng)該只有一個方法,該方法返回類型為void. 它只是對Stream中的元素進行某些操作,但是操作之后的數(shù)據(jù)并不返回到Stream中,所以Stream中的元素還是原來的元素.

  map的定義

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

  map方法接收一個Function作為入?yún)? Function是有返回值的, 這就表示map對Stream中的元素的操作結(jié)果都會返回到Stream中去.

到此這篇關(guān)于Stream中的Peek操作的文章就介紹到這了,更多相關(guān)Stream Peek操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Eclipse遠程debug的步驟與注意事項

    Eclipse遠程debug的步驟與注意事項

    今天小編就為大家分享一篇關(guān)于Eclipse遠程debug的步驟與注意事項,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 關(guān)于synchronized有趣的同步問題

    關(guān)于synchronized有趣的同步問題

    今天小編就為大家分享一篇關(guān)于關(guān)于synchronized有趣的同步問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MultipartFile文件判斷是否存在的操作

    MultipartFile文件判斷是否存在的操作

    這篇文章主要介紹了MultipartFile文件判斷是否存在的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • logback ThresholdFilter臨界值日志過濾器源碼解讀

    logback ThresholdFilter臨界值日志過濾器源碼解讀

    這篇文章主要為大家介紹了logback ThresholdFilter臨界值日志過濾器源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java Integer.valueOf()和Integer.parseInt()的區(qū)別說明

    Java Integer.valueOf()和Integer.parseInt()的區(qū)別說明

    這篇文章主要介紹了Java Integer.valueOf()和Integer.parseInt()的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java后端進行跨域的幾種方式小結(jié)

    java后端進行跨域的幾種方式小結(jié)

    本文主要介紹了java后端進行跨域的幾種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Springboot集成Actuator監(jiān)控功能詳解

    Springboot集成Actuator監(jiān)控功能詳解

    這篇文章主要介紹了Springboot集成Actuator監(jiān)控功能詳解,有時候我們想要實時監(jiān)控我們的應(yīng)用程序的運行狀態(tài),比如實時顯示一些指標數(shù)據(jù),觀察每時每刻訪問的流量,或者是我們數(shù)據(jù)庫的訪問狀態(tài)等等,這時候就需要Actuator了,需要的朋友可以參考下
    2023-09-09
  • Java實現(xiàn)的微信公眾號獲取微信用戶信息示例

    Java實現(xiàn)的微信公眾號獲取微信用戶信息示例

    這篇文章主要介紹了Java實現(xiàn)的微信公眾號獲取微信用戶信息,結(jié)合實例形式分析了Java微信公眾號獲取微信用戶信息相關(guān)原理、步驟與操作注意事項,需要的朋友可以參考下
    2019-10-10
  • gRPC在Java中的實現(xiàn)與應(yīng)用詳解

    gRPC在Java中的實現(xiàn)與應(yīng)用詳解

    gRPC是由Google開發(fā)的高性能、開源的通用遠程過程調(diào)用(RPC)框架,本文將詳細介紹如何在Java中使用gRPC,包括服務(wù)定義、服務(wù)器端實現(xiàn)、客戶端調(diào)用以及一些高級特性,我們將通過代碼示例來幫助理解gRPC的工作原理,需要的朋友可以參考下
    2024-06-06
  • 帶你入門java雪花算法原理

    帶你入門java雪花算法原理

    SnowFlake 算法,是 Twitter 開源的分布式 id 生成算法。其核心思想就是:使用一個 64 bit 的 long 型的數(shù)字作為全局唯一 id。在分布式系統(tǒng)中的應(yīng)用十分廣泛,且ID 引入了時間戳,基本上保持自增的
    2021-06-06

最新評論

小金县| 永济市| 崇仁县| 泾川县| 嘉定区| 沅陵县| 德昌县| 綦江县| 榆中县| 托克逊县| 洪湖市| 岳阳县| 贵溪市| 南充市| 南开区| 中超| 通渭县| 新邵县| 哈尔滨市| 潜江市| 高尔夫| 岑溪市| 宁城县| 巍山| 望城县| 涪陵区| 临湘市| 鄱阳县| 绩溪县| 资中县| 铜山县| 六盘水市| 望江县| 湘阴县| 高平市| 宜黄县| 石泉县| 满洲里市| 锡林浩特市| 阳东县| 荥经县|