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

java理論基礎(chǔ)Stream API終端操作示例解析

 更新時間:2022年03月16日 15:09:51   作者:字母哥哥  
這篇文章主要為大家介紹了java理論基礎(chǔ)Stream API終端操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、Java Stream管道數(shù)據(jù)處理操作

在本號之前寫過的文章中,曾經(jīng)給大家介紹過 Java Stream管道流是用于簡化集合類元素處理的java API。在使用的過程中分為三個階段。在開始本文之前,我覺得仍然需要給一些新朋友介紹一下這三個階段,如圖:

Java Stream函數(shù)式編程?用過都說好,案例圖文詳解送給你

  • 第一階段(圖中藍色):將集合、數(shù)組、或行文本文件轉(zhuǎn)換為java Stream管道流
  • 第二階段(圖中虛線部分):管道流式數(shù)據(jù)處理操作,處理管道中的每一個元素。上一個管道中的輸出元素作為下一個管道的輸入元素。
  • 第三階段(圖中綠色):管道流結(jié)果處理操作,也就是本文的將介紹的核心內(nèi)容。

在開始學(xué)習(xí)之前,仍然有必要回顧一下我們之前給大家講過的一個例子:

List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
List<String> list = nameStrs.stream()
        .filter(s -> s.startsWith("L"))
        .map(String::toUpperCase)
        .sorted()
        .collect(toList());
System.out.println(list);

首先使用stream()方法將字符串List轉(zhuǎn)換為管道流Stream

然后進行管道數(shù)據(jù)處理操作,先用fliter函數(shù)過濾所有大寫L開頭的字符串,然后將管道中的字符串轉(zhuǎn)換為大寫字母toUpperCase,然后調(diào)用sorted方法排序。這些API的用法在本號之前的文章有介紹過。其中還使用到了lambda表達式和函數(shù)引用。

最后使用collect函數(shù)進行結(jié)果處理,將java Stream管道流轉(zhuǎn)換為List。最終list的輸出結(jié)果是:[LEMUR, LION]

如果你不使用java Stream管道流的話,想一想你需要多少行代碼完成上面的功能呢?回到正題,這篇文章就是要給大家介紹第三階段:對管道流處理結(jié)果都可以做哪些操作呢?下面開始吧!

二、ForEach和ForEachOrdered

如果我們只是希望將Stream管道流的處理結(jié)果打印出來,而不是進行類型轉(zhuǎn)換,我們就可以使用forEach()方法或forEachOrdered()方法。

Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEach(System.out::println);
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEachOrdered(System.out::println);

parallel()函數(shù)表示對管道中的元素進行并行處理,而不是串行處理,這樣處理速度更快。但是這樣就有可能導(dǎo)致管道流中后面的元素先處理,前面的元素后處理,也就是元素的順序無法保證

forEachOrdered從名字上看就可以理解,雖然在數(shù)據(jù)處理順序上可能無法保障,但是forEachOrdered方法可以在元素輸出的順序上保證與元素進入管道流的順序一致。也就是下面的樣子(forEach方法則無法保證這個順序):

Monkey
Lion
Giraffe
Lemur
Lion

三、元素的收集collect

java Stream 最常見的用法就是:一將集合類轉(zhuǎn)換成管道流,二對管道流數(shù)據(jù)處理,三將管道流處理結(jié)果在轉(zhuǎn)換成集合類。那么collect()方法就為我們提供了這樣的功能:將管道流處理結(jié)果在轉(zhuǎn)換成集合類。

3.1.收集為Set

通過Collectors.toSet()方法收集Stream的處理結(jié)果,將所有元素收集到Set集合中。

Set<String> collectToSet = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
) 
.collect(Collectors.toSet());
//最終collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set會去重。

3.2.收集到List

同樣,可以將元素收集到List使用toList()收集器中。

List<String> collectToList = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toList());

// 最終collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

3.3.通用的收集方式

上面為大家介紹的元素收集方式,都是專用的。比如使用Collectors.toSet()收集為Set類型集合;使用Collectors.toList()收集為List類型集合。那么,有沒有一種比較通用的數(shù)據(jù)元素收集方式,將數(shù)據(jù)收集為任意的Collection接口子類型。 所以,這里就像大家介紹一種通用的元素收集方式,你可以將數(shù)據(jù)元素收集到任意的Collection類型:即向所需Collection類型提供構(gòu)造函數(shù)的方式。

LinkedList<String> collectToCollection = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toCollection(LinkedList::new));
//最終collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

注意:代碼中使用了LinkedList::new,實際是調(diào)用LinkedList的構(gòu)造函數(shù),將元素收集到Linked List。當(dāng)然你還可以使用諸如LinkedHashSet::newPriorityQueue::new將數(shù)據(jù)元素收集為其他的集合類型,這樣就比較通用了。

3.4.收集到Array

通過toArray(String[]::new)方法收集Stream的處理結(jié)果,將所有元素收集到字符串?dāng)?shù)組中。

String[] toArray = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
) .toArray(String[]::new);
//最終toArray字符串?dāng)?shù)組中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

3.5.收集到Map

使用Collectors.toMap()方法將數(shù)據(jù)元素收集到Map里面,但是出現(xiàn)一個問題:那就是管道中的元素是作為key,還是作為value。我們用到了一個Function.identity()方法,該方法很簡單就是返回一個“ t -> t ”(輸入就是輸出的lambda表達式)。另外使用管道流處理函數(shù)distinct()來確保Map鍵值的唯一性。

Map<String, Integer> toMap = Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.distinct()
.collect(Collectors.toMap(
       Function.identity(),   //元素輸入就是輸出,作為key
       s -> (int) s.chars().distinct().count()// 輸入元素的不同的字母個數(shù),作為value
));
// 最終toMap的結(jié)果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}   

3.6.分組收集groupingBy

Collectors.groupingBy用來實現(xiàn)元素的分組收集,下面的代碼演示如何根據(jù)首字母將不同的數(shù)據(jù)元素收集到不同的List,并封裝為Map。

Map<Character, List<String>> groupingByList =  Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.collect(Collectors.groupingBy(
       s -> s.charAt(0) ,  //根據(jù)元素首字母分組,相同的在一組
       // counting()        // 加上這一行代碼可以實現(xiàn)分組統(tǒng)計
));
// 最終groupingByList內(nèi)的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}
//如果加上counting() ,結(jié)果是:  {G=1, L=3, M=1}

這是該過程的說明:groupingBy第一個參數(shù)作為分組條件,第二個參數(shù)是子收集器。

四、其他常用方法

boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);
// 判斷管道中是否包含2,結(jié)果是: true
long nrOfAnimals = Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur"
).count();
// 管道中元素數(shù)據(jù)總計結(jié)果nrOfAnimals: 4
int sum = IntStream.of(1, 2, 3).sum();
// 管道中元素數(shù)據(jù)累加結(jié)果sum: 6
OptionalDouble average = IntStream.of(1, 2, 3).average();
//管道中元素數(shù)據(jù)平均值average: OptionalDouble[2.0]
int max = IntStream.of(1, 2, 3).max().orElse(0);
//管道中元素數(shù)據(jù)最大值max: 3
IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();
// 全面的統(tǒng)計結(jié)果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

以上就是java理論基礎(chǔ)Stream API終端操作示例解析的詳細內(nèi)容,更多關(guān)于java Stream API終端操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題)

    java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題)

    這篇文章主要介紹了java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java 構(gòu)造方法的使用詳解

    Java 構(gòu)造方法的使用詳解

    構(gòu)造方法是類的一種特殊方法,用來初始化類的一個新的對象,在創(chuàng)建對象(new 運算符)之后自動調(diào)用。Java 中的每個類都有一個默認的構(gòu)造方法,并且可以有一個以上的構(gòu)造方法
    2021-11-11
  • IDEA編譯報錯:Error:(2048,1024) java: 找不到符號的解決方案

    IDEA編譯報錯:Error:(2048,1024) java: 找不到符號的解決方案

    在使用 Lombok 的過程中,你是否曾遇到過 IDEA 編譯報錯 Error:(2048,1024) java: 找不到符號?下面就讓我們來深入剖析這一問題的根源,并給出相應(yīng)的解決方案,需要的朋友可以參考下
    2025-02-02
  • Java中Calendar類的一些常用方法小結(jié)

    Java中Calendar類的一些常用方法小結(jié)

    項目當(dāng)中,我們經(jīng)常會涉及到對時間的處理,Date類最主要的作用就是獲得當(dāng)前時間,同時這個類里面也具有設(shè)置時間以及一些其他的功能,但更推薦使用 Calendar 類進行時間和日期的處理,這篇文章主要給大家介紹了關(guān)于Java中Calendar類的一些常用方法,需要的朋友可以參考下
    2021-11-11
  • spring?data?jpa查詢一個實體類的部分屬性方式

    spring?data?jpa查詢一個實體類的部分屬性方式

    這篇文章主要介紹了spring?data?jpa查詢一個實體類的部分屬性方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 使用@Autowired注解引入server服務(wù)層方法時報錯的解決

    使用@Autowired注解引入server服務(wù)層方法時報錯的解決

    這篇文章主要介紹了使用@Autowired注解引入server服務(wù)層方法時報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java正則替換手機號代碼實例

    Java正則替換手機號代碼實例

    本文的主要內(nèi)容是Java語言中正則表達式替換手機號的第4到第7位,實現(xiàn)方法十分簡單,同時涉及了一些正則表達式的相關(guān)用法,需要的朋友可以參考下。
    2017-09-09
  • Java Base64算法實際應(yīng)用之郵件發(fā)送實例分析

    Java Base64算法實際應(yīng)用之郵件發(fā)送實例分析

    這篇文章主要介紹了Java Base64算法實際應(yīng)用之郵件發(fā)送,結(jié)合實例形式分析了java字符編碼與郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Spring6.x對調(diào)度和異步執(zhí)行的注解支持示例詳解

    Spring6.x對調(diào)度和異步執(zhí)行的注解支持示例詳解

    這篇文章主要為大家介紹了Spring6.x對調(diào)度和異步執(zhí)行的注解支持示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • spring?cloud?eureka注冊原理-注冊失敗填坑筆記

    spring?cloud?eureka注冊原理-注冊失敗填坑筆記

    這篇文章主要介紹了spring?cloud?eureka注冊原理-注冊失敗填坑筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

板桥市| 宽甸| 伊宁县| 巴青县| 凤庆县| 霍林郭勒市| 喀喇| 石河子市| 泰安市| 通江县| 潜江市| 清流县| 丰镇市| 都江堰市| 成都市| 扶绥县| 新建县| 石楼县| 浪卡子县| 信宜市| 洮南市| 房山区| 渝中区| 辽宁省| 威信县| 巢湖市| 泸水县| 连江县| 靖远县| 兰溪市| 苍溪县| 故城县| 南召县| 石阡县| 彩票| 永康市| 姚安县| 永清县| 甘洛县| 沧州市| 阳信县|