Java 的Stream流
一、定義
JDK1.8 中增加了Stream流,Stream流是一個來自數據源的元素隊列并支持聚合操作。元素是特定類型的對象,形成一個隊列,Java中的Stream并不會存儲元素,而是按需計算數據源是流的來源,可以使集合,數組,I/O channel,生成器generator等。聚合操作類似SQL語句一樣的操作,比如filter
,map
,reduce
,match
,sorted
等
二、操作的特征
- 中間的操作都會返回流對象本身,這樣多個操作可以串聯成一個管道,如同流式風格
- 內部迭代:以前對集合的遍歷是通過Iterator或者For-Each的方式,顯式的在集合外部進行迭代,這叫做外部迭代,而Stream流式內部迭代。
三、代碼示例
1、生成流
如下代碼的意思是,首先創建一個集合,然后過濾出所有不為空的元素,重新組成一個集合
1
2
3
|
List<String> stringList = Arrays.asList( "abc" , "" , "bc" , "efg" , "abcd" , "" ); List<String> strings = stringList.stream().filter(string -> StringUtils.isNotBlank(string)).collect(Collectors.toList()); System.out.println( "*********過濾后的集合是" +strings); |
2、forEach 迭代
1
|
strings.forEach(System.out::println); |
3、limit方法用于獲取指定數量的流
如下就是獲取一個長度為10的流。
1
2
|
Random random = new Random(); random.ints().limit( 10 ).forEach(System.out::println); |
4、map
map方法用于映射每個元素,以下代碼片段使用map輸出元素對應的平方數
1
2
3
4
|
vList<Integer> numbers = Arrays.asList( 3 , 2 , 2 , 3 , 7 , 3 , 5 , 8 , 9 ); //獲取對應的平方數 List<Integer> integers = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList()); System.out.println( "*********獲取對應的平方數" +integers); |
5、sorted
sorted方法用于對流進行排序
如下,就是按照元素的大小進行排序
1
2
3
|
List<Integer> orgList = Arrays.asList( 10 , 9 , 8 , 7 , 6 , 13 , 16 , 0 , 1 , 2 ); List<Integer> sortedList = orgList.stream().sorted().collect(Collectors.toList()); System.out.println( "*********排序后集合是" +sortedList); |
6、并行(parallel)程序
1
2
3
4
|
List<String> emptyList = Arrays.asList( "abc" , "" , "bc" , "efg" , "abcd" , "" , "" ); //獲取空字符串的數量 long count = emptyList.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println( "*****集合中的空字符串個數=" + count); |
7、Collectors
Collectors類實現了很多歸約操作,例如將流轉換成集合和集合元素,Collectors可用于返回列表或字符串
1
2
3
4
5
6
7
|
List<String> orgCollectors = Arrays.asList( "abc" , "" , "bc" , "efg" , "abcd" , "" , "jkl" ); List<String> filtered = orgCollectors.stream().filter(string -> !string.isEmpty()) .collect(Collectors.toList()); System.out.println( "篩選列表:" + filtered); String mergedString = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining( "," )); System.out.println( "合并字符串:" + mergedString); |
統計:
1
2
3
4
5
6
7
|
//統計 List<Integer> orgNums = Arrays.asList( 3 , 2 , 2 , 3 , 7 , 3 , 5 ); IntSummaryStatistics statistics = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println( "列表中最大的數:" + statistics.getMax()); System.out.println( "列表中最小的數:" + statistics.getMin()); System.out.println( "所有數之和:" + statistics.getSum()); System.out.println( "平均數:" + statistics.getAverage()); |
8、轉化(將枚舉類轉成map)
將一個枚舉類轉成一個map,使用的示例可以參考下方:
1
|
Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc())); |
完整的代碼是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public enum DisableFlagEnum { NORMAL( 0 , "正常" ), DELETE( 1 , "已刪除" ); private Integer code; private String desc; DisableFlagEnum(Integer code, String desc) { this .code = code; this .desc = desc; } public Integer getCode() { return code; } public String getDesc() { return desc; } public static String getDesc(Integer code) { Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc())); return disableFlagMap.get(code); } } |
demo的運行結果:
總結:
本文首先介紹了JDK1.8中的Stream流,Stream流是是一個來自數據源的元素隊列并支持聚合操作。它的特點就是中間過程不會存儲數據,不會改變數據源本身。接著介紹了stream的使用示例,stream流的使用一般是要結合函數式接口使用的。
以上就是Java的Stream流的詳細內容,更多關于Java的Stream流的資料請關注服務器之家其它相關文章!希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/u014534808/article/details/104372832