Java 8 新特性:Stream 流快速入門

柒墨轩發表於2024-07-18

前言

在 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 提供了一種高效且易於使用的處理資料的方式。讓程式設計師寫出高效率、乾淨、簡潔的程式碼。

相關文章