日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作

發布時間:2023/12/2 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2、數據源的獲取

2.1、數據源的簡介

數據源,顧名思義,既是流中的數據的來源。是集合的流式編程的第一步,將數據源中的數據讀取到流中,進行處理。注意:將數據讀取到流中進行處理的時候,與數據源中的數據沒有關系。也就是說,中間操作對流中的數據進行處理、過濾、映射、排序...,此時是不會影響數據源中的數據的。

2.2、數據源的獲取

這個過程,其實是將一個容器中的數據,讀取到一個流中。因此無論什么容器作為數據源,讀取到流中的方法返回值一定是一個Stream。

// 1、通過Collection接口中的stream()方法獲取數據源為Collection的流Stream stream = list.stream();

// 2、通過Collection接口的parallelStream()方法獲取數據源為Collection的流Stream stream = list.parallelStream();

// 3、通過Arrays工具類中的stream()方法獲取數據源為數組的流IntStream stream = Arrays.stream(array);關于stream()和parallelStream

他們都是Collection集合獲取數據源的方法,不同點在于stream()方法獲取的數據源是串行的,parallelStream()獲取的數據源是并行的。parallelStream()內部集成了多個線程對流中的數據進行操作,效率更高。

3、最終操作

3.1、最終操作的簡介

將流中的數據整合到一起,可以存入一個集合,也可以直接對流中的數據進行遍歷、數據統計...,通過最終操作,需要掌握如何從流中提取出來我們想要的信息。

注意事項:最終操作,之所以叫最終操作,是因為,在最終操作執行結束后,會關閉這個流,流中的所有數據都會銷毀。如果使用一個已經關閉了的流,會出現異常。

3.2、collect

將流中的數據收集到一起,對這些數據進行一些處理。最常見的處理,就是將流中的數據存入一個集合。collect方法的參數,是一個Collector接口,而且這個接口并不是一個函數式接口。實現這個接口,可以自定義收集的規則。但是,絕大部分情況下,不需要自定義。

直接使用 Collectors 工具類提供的方法即可。

// 1.1、轉成 ListList result1 = list.stream().collect(Collectors.toList());

System.out.println(result1);

?

// 1.2、轉成 SetSet result2 = list.stream().collect(Collectors.toSet());

System.out.println(result2);

?

// 1.3、轉成 Map,提供兩個函數式接口的實現,分別實現鍵的生成規則和值的生成規則Map result3 = list.stream().collect(Collectors.toMap(ele -> ele / 10, ele -> ele));

System.out.println(result3);

3.3、reduce

將流中的數據按照一定的規則聚合起來。

// 將流的元素,逐一帶入到這個方法中,進行運算// 最終的運算結果,得到的其實是一個 Optional 類型,需要使用 get() 獲取到里面的數據int result4 = list.stream().reduce((e1, e2) -> e1 + e2).get();

System.out.println(result4);

3.4、count

統計流中的元素數量。

long result5 = list.stream().count();

System.out.println(result5);

3.5、forEach

迭代、遍歷流中的數據。

list.stream().forEach(System.out::println);

3.6、max & min

獲取流中的最大的元素、最小的元素。

// 獲取最大值Integer result6 = list.stream().max(Integer::compareTo).get();

System.out.println("max is : " + result6);

// 獲取最小值Integer result7 = list.stream().min(Integer::compareTo).get();

System.out.println("min is : " + result7);

3.7、Matching

allMatch: 只有當流中所有的元素,都匹配指定的規則,才會返回 true

anyMatch: 只要流中有任意的數據,滿足指定的規則,都會返回 true

noneMatch: 只有當流中的所有的元素,都不滿足指定的規則,才會返回true

// 判斷流中是否所有的元素都大于 50boolean result8 = list.stream().allMatch(ele -> ele > 50);

System.out.println(result8);

?

// 判斷流中是否有大于 50 的數據boolean result9 = list.stream().anyMatch(ele -> ele > 50);

System.out.println(result9);

?

// 判斷流中是否沒有奇數boolean result10 = list.stream().noneMatch(ele -> ele % 2 != 0);

System.out.println(result10);

3.8、find

findFirst: 從流中獲取一個元素(一般情況下,是獲取的開頭的元素)

findAny: 從流中獲取一個元素(一般情況下,是獲取的開頭的元素)

這兩個方法,絕大部分情況下,是完全相同的,但是在多線程的環境下,findAny和find返回的結果可能不一樣。

Integer result11 = list.parallelStream().findFirst().get();

System.out.println(result11);

?

Integer result12 = list.parallelStream().findAny().get();

System.out.println(result12);

3.9、最終操作的注意事項

最終操作,會關閉流。如果一個流被關閉了,再去使用這個流,就出出現異常。

// 9、最終操作錯誤示范Stream stream = list.stream();

long count = stream.count();

stream.forEach(System.out::println);

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed

at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)

at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)

at com.qf.cstream.FinalOperationDemo.main(FinalOperationDemo.java:78)

?

總結

以上是生活随笔為你收集整理的java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。