亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2020年04月24日 09:27:36   作者:flydean程序那些事  
這篇文章主要介紹了Java 8 Stream操作類型及peek示例解析,文中通過(guò)示例代碼介紹的非常詳細(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í)際上沒(méi)有任何輸出。

為什么呢?

中間操作和終止操作

一個(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ì)真正的開(kāi)始執(zhí)行。

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

peek

我們看下peek的文檔說(shuō)明: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中的元素并沒(méi)有被轉(zhuǎn)換成大寫(xiě)格式。

再看一個(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是沒(méi)有返回值的,它只是對(duì)Stream中的元素進(jìn)行某些操作,但是操作之后的數(shù)據(jù)并不返回到Stream中,所以Stream中的元素還是原來(lái)的元素。

而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)文章

  • 實(shí)例講解Java處理PDF圖章的方法

    實(shí)例講解Java處理PDF圖章的方法

    在本篇文章里小編給大家分享了關(guān)于Java處理PDF圖章的方法,對(duì)此有需要的朋友們可以學(xué)習(xí)下。
    2019-02-02
  • JDK與Dubbo中的SPI詳細(xì)介紹

    JDK與Dubbo中的SPI詳細(xì)介紹

    這篇文章主要介紹了JDK中的SPI與Dubbo中的SPI,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • JAVA中哈希表HashMap的深入學(xué)習(xí)

    JAVA中哈希表HashMap的深入學(xué)習(xí)

    這篇文章主要介紹了哈希表HashMap的深入學(xué)習(xí),哈希表是一種非常重要的數(shù)據(jù)結(jié)構(gòu),許多緩存技術(shù)(比如memcached)的核心其實(shí)就是在內(nèi)存中維護(hù)一張大的哈希表,本文會(huì)對(duì)java集合框架中HashMap的實(shí)現(xiàn)原理進(jìn)行講解。感興趣的話可以一起來(lái)學(xué)習(xí)
    2020-07-07
  • Jackson自定義序列化與反序列化注解詳解

    Jackson自定義序列化與反序列化注解詳解

    這篇文章主要介紹了Jackson自定義序列化與反序列化注解詳解,某些場(chǎng)景下,我們使用Jackson對(duì)數(shù)據(jù)進(jìn)行序列化或反序列化的時(shí)候,需要對(duì)某些數(shù)據(jù)進(jìn)行特殊處理,需要的朋友可以參考下
    2023-11-11
  • JAVA基礎(chǔ)之繼承(inheritance)詳解

    JAVA基礎(chǔ)之繼承(inheritance)詳解

    繼承(inheritance)是Java OOP中一個(gè)非常重要的概念。這篇文章主要介紹了JAVA基礎(chǔ)之繼承(inheritance),需要的朋友可以參考下
    2017-03-03
  • 詳解Java多線程與并發(fā)

    詳解Java多線程與并發(fā)

    多線程是一個(gè)進(jìn)程在執(zhí)行過(guò)程中產(chǎn)生多個(gè)更小的程序單元,這些更小的單元稱為線程,這些線程可以同時(shí)存在,同時(shí)運(yùn)行,一個(gè)進(jìn)程可能包含多個(gè)同時(shí)執(zhí)行的線程。多線程是實(shí)現(xiàn)并發(fā)機(jī)制的一種有效手段。進(jìn)程和線程一樣,都是實(shí)現(xiàn)并發(fā)的一個(gè)基本單位。
    2021-06-06
  • nacos將服務(wù)注冊(cè)到不同的命名空間下問(wèn)題

    nacos將服務(wù)注冊(cè)到不同的命名空間下問(wèn)題

    Nacos是SpringCloudAlibaba架構(gòu)中最重要的組件,提供注冊(cè)中心、配置中心和動(dòng)態(tài)DNS服務(wù)三大功能,如果需要配置多個(gè)數(shù)據(jù)庫(kù)適配的環(huán)境,啟動(dòng)服務(wù)時(shí)需要將服務(wù)注冊(cè)到不同的命名空間下,并配置新部署的網(wǎng)關(guān)服務(wù)ip和端口或者域名
    2024-12-12
  • SpringBoot啟動(dòng)失敗的原因及其解決方法

    SpringBoot啟動(dòng)失敗的原因及其解決方法

    對(duì)于springboot的啟動(dòng)失敗,相信大家都有經(jīng)歷,但是為什么會(huì)啟動(dòng)失敗,以及怎么解決都只能通過(guò)日志進(jìn)行查看,在這里,我會(huì)將常見(jiàn)的springboot啟動(dòng)失敗的報(bào)錯(cuò)一一展示,需要的朋友可以參考下
    2024-06-06
  • PHP Laravel實(shí)現(xiàn)文件下載功能

    PHP Laravel實(shí)現(xiàn)文件下載功能

    本文重點(diǎn)給大家介紹Laravel實(shí)現(xiàn)文件下載功能的實(shí)例代碼,需要的朋友參考下吧
    2017-09-09
  • Activiti7通過(guò)代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解

    Activiti7通過(guò)代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Activiti7通過(guò)代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評(píng)論