前言
在 java 中,涉及到對陣列、集合等集合類元素的操作時,通常我們使用的是迴圈的方式進行逐個遍歷處理,或者使用 stream 流的方式進行處理。
什麼是 Stream?
Stream(流)是一個來自資料來源的元素佇列並支援聚合操作,流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。 Stream(流)的組成包含:元素、資料來源、聚合操作、內部迭代、Pipelining等。
建立 Stream 流
1)stream()
Stream<String> stream = stringList.stream();
2)parallelStream()
Stream<String> stringStream = stringList.parallelStream();
Stream 流常用操作
1)forEach
stringList.forEach(System.out::println);
2)map
stringList.stream().map(i->i.equals("juejin"));
3)filter
stringList.stream().filter(i->i.equals("juejin"));
4)limit
integerList.stream().limit(3);
5)skip
integerList.stream().skip(5).limit(3);
6)distinct
integerList.stream().distinct().collect(Collectors.toList());
7)sorted
integerList.stream().sorted();
8)sorted(Comparator com)
integerList.stream().sorted(Comparator.comparing(Integer::intValue));
9)Collectors 收集器
- 恆等處理 Collectors
所謂恆等處理,指的就是Stream的元素在經過Collector函式處理前後完全不變,例如toList()操作,只是最終將結果從Stream中取出放入到List物件中,並沒有對元素本身做任何的更改處理
list.stream().collect(Collectors.toList());
list.stream().collect(Collectors.toSet());
list.stream().collect(Collectors.toCollection());
- 歸約彙總 Collectors
對於歸約彙總類的操作,Stream流中的元素逐個遍歷,進入到Collector處理函式中,然後會與上一個元素的處理結果進行合併處理,並得到一個新的結果,以此類推,直到遍歷完成後,輸出最終的結果
counting
|
統計流中的元素個數
|
summingInt
|
計算流中指定int欄位的累加總和。針對不同型別的數字型別,有不同的方法,比如summingDouble等
|
averagingInt
|
計算流中指定int欄位的平均值。針對不同型別的數字型別,有不同的方法,比如averagingLong等
|
joining
|
將流中所有元素(或者元素的指定欄位)字串值進行拼接,可以指定拼接連線符,或者首尾拼接字元
|
maxBy
|
根據給定的比較器,選擇出值最大的元素
|
minBy
|
根據給定的比較器,選擇出值最小的元素
|
- 分組分割槽 Collectors
僅僅是做一個常規的資料分組操作時,可以僅傳入一個分組函式即可
public void groupBySubCompany() { // 按照子公司維度將員工分組 Map<String, List<Employee>> resultMap = getAllEmployees().stream() .collect(Collectors.groupingBy(Employee::getSubCompany)); System.out.println(resultMap); }
如果不僅需要分組,還需要對分組後的資料進行處理的時候,則需要同時給定分組函式以及值收集器
public void groupAndCaculate() { // 按照子公司分組,並統計每個子公司的員工數 Map<String, Long> resultMap = getAllEmployees().stream() .collect(Collectors.groupingBy(Employee::getSubCompany, Collectors.counting())); System.out.println(resultMap); }
總結
簡而言之,Stream API 提供了一種高效且易於使用的處理資料的方式。讓程式設計師寫出高效率、乾淨、簡潔的程式碼。