<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在本號之前寫過的文章中,曾經給大家介紹過 Java Stream管道流是用於簡化集合類元素處理的java API。在使用的過程中分為三個階段。在開始本文之前,我覺得仍然需要給一些新朋友介紹一下這三個階段,如圖:
在開始學習之前,仍然有必要回顧一下我們之前給大家講過的一個例子:
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轉換為管道流Stream然後進行管道資料處理操作,先用fliter函數過濾所有大寫L開頭的字串,然後將管道中的字串轉換為大寫字母toUpperCase,然後呼叫sorted方法排序。這些API的用法在本號之前的文章有介紹過。其中還使用到了lambda表示式和函數參照。最後使用collect函數進行結果處理,將java Stream管道流轉換為List。最終list的輸出結果是:[LEMUR, LION]
如果你不使用java Stream管道流的話,想一想你需要多少行程式碼完成上面的功能呢?回到正題,這篇文章就是要給大家介紹第三階段:對管道流處理結果都可以做哪些操作呢?下面開始吧!
如果我們只是希望將Stream管道流的處理結果列印出來,而不是進行型別轉換,我們就可以使用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()函數表示對管道中的元素進行並行處理,而不是序列處理,這樣處理速度更快。但是這樣就有可能導致管道流中後面的元素先處理,前面的元素後處理,也就是元素的順序無法保證
forEachOrdered從名字上看就可以理解,雖然在資料處理順序上可能無法保障,但是forEachOrdered方法可以在元素輸出的順序上保證與元素進入管道流的順序一致。也就是下面的樣子(forEach方法則無法保證這個順序):
Monkey
Lion
Giraffe
Lemur
Lion
java Stream 最常見的用法就是:一將集合類轉換成管道流,二對管道流資料處理,三將管道流處理結果在轉換成集合類。那麼collect()方法就為我們提供了這樣的功能:將管道流處理結果在轉換成集合類。
通過Collectors.toSet()方法收集Stream的處理結果,將所有元素收集到Set集合中。
Set<String> collectToSet = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ) .collect(Collectors.toSet()); //最終collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set會去重。
同樣,可以將元素收集到List
使用toList()
收集器中。
List<String> collectToList = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ).collect(Collectors.toList()); // 最終collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
上面為大家介紹的元素收集方式,都是專用的。比如使用Collectors.toSet()收集為Set型別集合;使用Collectors.toList()收集為List型別集合。那麼,有沒有一種比較通用的資料元素收集方式,將資料收集為任意的Collection介面子型別。
所以,這裡就像大家介紹一種通用的元素收集方式,你可以將資料元素收集到任意的Collection型別:即向所需Collection型別提供建構函式的方式。
LinkedList<String> collectToCollection = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ).collect(Collectors.toCollection(LinkedList::new)); //最終collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
注意:程式碼中使用了LinkedList::new,實際是呼叫LinkedList的建構函式,將元素收集到Linked List。當然你還可以使用諸如LinkedHashSet::new
和PriorityQueue::new
將資料元素收集為其他的集合型別,這樣就比較通用了。
通過toArray(String[]::new)方法收集Stream的處理結果,將所有元素收集到字串陣列中。
String[] toArray = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ) .toArray(String[]::new); //最終toArray字串陣列中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
使用Collectors.toMap()方法將資料元素收集到Map裡面,但是出現一個問題:那就是管道中的元素是作為key,還是作為value。我們用到了一個Function.identity()方法,該方法很簡單就是返回一個“ t -> t ”(輸入就是輸出的lambda表示式)。另外使用管道流處理常式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()// 輸入元素的不同的字母個數,作為value )); // 最終toMap的結果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}
Collectors.groupingBy用來實現元素的分組收集,下面的程式碼演示如何根據首字母將不同的資料元素收集到不同的List,並封裝為Map。
Map<Character, List<String>> groupingByList = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ) .collect(Collectors.groupingBy( s -> s.charAt(0) , //根據元素首字母分組,相同的在一組 // counting() // 加上這一行程式碼可以實現分組統計 )); // 最終groupingByList內的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]} //如果加上counting() ,結果是: {G=1, L=3, M=1}
boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2); // 判斷管道中是否包含2,結果是: true long nrOfAnimals = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur" ).count(); // 管道中元素資料總計結果nrOfAnimals: 4 int sum = IntStream.of(1, 2, 3).sum(); // 管道中元素資料累加結果sum: 6 OptionalDouble average = IntStream.of(1, 2, 3).average(); //管道中元素資料平均值average: OptionalDouble[2.0] int max = IntStream.of(1, 2, 3).max().orElse(0); //管道中元素資料最大值max: 3 IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics(); // 全面的統計結果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}
以上就是Java Stream函數語言程式設計管道流結果處理的詳細內容,更多關於Stream管道流結果處理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45