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

Java 8 Stream操作類型及peek示例解析

 更新時(shí)間:2020年04月24日 09:27:36   作者:flydean程序那些事  
這篇文章主要介紹了Java 8 Stream操作類型及peek示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

簡(jiǎn)介

java 8 stream作為流式操作有兩種操作類型,中間操作和終止操作。這兩種有什么區(qū)別呢?

我們看一個(gè)peek的例子:

Stream<String> stream = Stream.of("one", "two", "three","four");
stream.peek(System.out::println);

上面的例子中,我們的本意是打印出Stream的值,但實(shí)際上沒有任何輸出。

為什么呢?

中間操作和終止操作

一個(gè)java 8的stream是由三部分組成的。數(shù)據(jù)源,零個(gè)或一個(gè)或多個(gè)中間操作,一個(gè)或零個(gè)終止操作。

中間操作是對(duì)數(shù)據(jù)的加工,注意,中間操作是lazy操作,并不會(huì)立馬啟動(dòng),需要等待終止操作才會(huì)執(zhí)行。

終止操作是stream的啟動(dòng)操作,只有加上終止操作,stream才會(huì)真正的開始執(zhí)行。

所以,問題解決了,peek是一個(gè)中間操作,所以上面的例子沒有任何輸出。

peek

我們看下peek的文檔說明:peek主要被用在debug用途。

我們看下debug用途的使用:

Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)
        .peek(e -> System.out.println("Filtered value: " + e))
        .map(String::toUpperCase)
        .peek(e -> System.out.println("Mapped value: " + e))
        .collect(Collectors.toList());

上面的例子輸出:

Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

上面的例子我們輸出了stream的中間值,方便我們的調(diào)試。

為什么只作為debug使用呢?我們?cè)倏匆粋€(gè)例子:

Stream.of("one", "two", "three","four").peek(u -> u.toUpperCase())
.forEach(System.out::println);

上面的例子我們使用peek將element轉(zhuǎn)換成為upper case。然后輸出:

one
two
three
four

可以看到stream中的元素并沒有被轉(zhuǎn)換成大寫格式。

再看一個(gè)map的對(duì)比:

Stream.of("one", "two", "three","four").map(u -> u.toUpperCase())
.forEach(System.out::println);

輸出:

ONE
TWO
THREE
FOUR

可以看到map是真正的對(duì)元素進(jìn)行了轉(zhuǎn)換。

當(dāng)然peek也有例外,假如我們Stream里面是一個(gè)對(duì)象會(huì)怎么樣?

  @Data
  @AllArgsConstructor
  static class User{
    private String name;
  }

    List<User> userList=Stream.of(new User("a"),new User("b"),new User("c")).peek(u->u.setName("kkk")).collect(Collectors.toList());
    log.info("{}",userList);

輸出結(jié)果:

10:25:59.784 [main] INFO com.flydean.PeekUsage - [PeekUsage.User(name=kkk), PeekUsage.User(name=kkk), PeekUsage.User(name=kkk)]

我們看到如果是對(duì)象的話,實(shí)際的結(jié)果會(huì)被改變。

為什么peek和map有這樣的區(qū)別呢?

我們看下peek和map的定義:

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

peek接收一個(gè)Consumer,而map接收一個(gè)Function。

Consumer是沒有返回值的,它只是對(duì)Stream中的元素進(jìn)行某些操作,但是操作之后的數(shù)據(jù)并不返回到Stream中,所以Stream中的元素還是原來的元素。

而Function是有返回值的,這意味著對(duì)于Stream的元素的所有操作都會(huì)作為新的結(jié)果返回到Stream中。

這就是為什么peek String不會(huì)發(fā)生變化而peek Object會(huì)發(fā)送變化的原因。

結(jié)論

我們?cè)诒疚闹兄v解了stream的兩個(gè)操作類型,并總結(jié)了peek的使用。希望大家能夠掌握。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/stream-peek

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來,java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細(xì)節(jié),需要的朋友可以參考下
    2023-12-12
  • SpringCloud的Hystrix簡(jiǎn)單介紹

    SpringCloud的Hystrix簡(jiǎn)單介紹

    這篇文章主要介紹了SpringCloud的Hystrix簡(jiǎn)單介紹,SpringCloud Hystrix是Netflix開源的一款容錯(cuò)框架,具備服務(wù)降級(jí),服務(wù)熔斷,依賴隔離,監(jiān)控(Hystrix Dashboard)等功能,同樣具有自我保護(hù)能力,需要的朋友可以參考下
    2023-07-07
  • SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法

    SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法

    這篇文章主要介紹了SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 一步步教你如何使用Java實(shí)現(xiàn)WebSocket

    一步步教你如何使用Java實(shí)現(xiàn)WebSocket

    websocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議,它實(shí)現(xiàn)了瀏覽器與服務(wù)器的全雙工通訊-允許服務(wù)器主動(dòng)發(fā)起信息個(gè)客戶端,websocket是一種持久協(xié)議,http是非持久協(xié)議,下面這篇文章主要給大家介紹了關(guān)于如何使用Java實(shí)現(xiàn)WebSocket的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • MyBatis的collection和association的使用解讀

    MyBatis的collection和association的使用解讀

    這篇文章主要介紹了MyBatis的collection和association的使用解讀
    2023-12-12
  • Java 八道經(jīng)典面試題之鏈表題

    Java 八道經(jīng)典面試題之鏈表題

    本位主要介紹了Java面試中常常遇到的八道經(jīng)典鏈表問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的小伙伴們可以學(xué)習(xí)一下
    2021-11-11
  • Eclipse內(nèi)置瀏覽器打開方法

    Eclipse內(nèi)置瀏覽器打開方法

    這篇文章主要介紹了Eclipse內(nèi)置瀏覽器打開方法,需要的朋友可以了解下。
    2017-09-09
  • spring Data jpa簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    spring Data jpa簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了spring Data jpa簡(jiǎn)介的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Java開發(fā)中常用記錄

    Java開發(fā)中常用記錄

    這篇文章主要介紹了Java-編程式事務(wù)、Java-Stream、Linux常用命令,需要的朋友可以參考下
    2023-05-05
  • Java?函數(shù)式編程梳理

    Java?函數(shù)式編程梳理

    這篇文章主要介紹了Java?函數(shù)式編程梳理,文章通過Lambda表達(dá)式展開詳細(xì)的內(nèi)容介紹,具有一定參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

霍山县| 长白| 大洼县| 迭部县| 全南县| 阳曲县| 高要市| 观塘区| 盱眙县| 忻城县| 普格县| 安阳市| 博罗县| 微博| 柘荣县| 绩溪县| 巢湖市| 葵青区| 蓬溪县| 英德市| 湖州市| 唐海县| 信宜市| 文安县| 荔波县| 上虞市| 资源县| 罗平县| 天长市| 瑞丽市| 昌图县| 济宁市| 改则县| 法库县| 江山市| 东明县| 宾川县| 雅安市| 长阳| 华阴市| 靖州|