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新特性 - 集合流式编程 - 最终操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java按键发出声音代码_怎么在java
- 下一篇: java 2d 教程_Java 2D开发