1. 程式人生 > 實用技巧 >Java Stream 流(JDK 8 新特性)

Java Stream 流(JDK 8 新特性)

什麼是 Steam

Java 8 中新增了 Stream(流)來簡化集合類的使用,Stream 本質上是個介面,介面中定義了很多對 Stream 物件的操作。

我們知道,Java 中 List 和 Set 集合都是基於 Collection 介面的擴充套件,在 Java 8 中新增了 stream( ) 方法來獲取 Stream 物件,方法如下:

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

注意:這裡的 default 也是 Java 8 中新引入的關鍵字,用於定義介面中方法的預設實現 。

所以,Java 中 Set 和 List 的集合都包含這個方法,我們可以通過 stream() 方法獲取這個集合的 Stream 物件

Steam 的簡單使用

  • 使用 for each 求和
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer element : list ) {
  sum += element;
}
System.out.println(sum);
  • 使用 Stream 求和
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (acc, value) -> acc + value);
System.out.println(sum);

reduce 方法的作用下面有介紹

改成這樣一目瞭然,程式碼變得非常乾淨利索。

上面程式碼先通過 stream() 方法獲取 Stream 物件,然後呼叫 Stream 中的 reduce 方法計算,然後獲取結果。

Stream 主要方法

Stream 中主要包含如下幾個方法:

  • collect(toList()):通過 Stream 生成一個列表

  • map:將流中的一個值轉換成一個新的值

  • filter: 過濾 Stream 中的元素

  • flatMap: 將多個 Stream 連線成一個 Stream

  • max: 求最大值

  • min: 求最小值

  • reduce: 從一組值中生成一個新的值

Stream 方法的使用

  • collect(toList()) 和 filter 方法的使用
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter((value) -> value > 2).collect(toList());
result.forEach((value) -> System.out.print(value));

上面的程式碼先建立了一個 List 物件並初始化,然後使用 filter 方法篩選出集合元素大於 2 的值,再用 collect(toList()) 將篩選出的結果存放到新生成的 List 集合中,最後用 forEach 遍歷集合列印集合元素。

  • map 方法的使用
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<String> result = list.stream().map(value -> String.format("String:%s", value)).collect(toList());
result.forEach((value) -> System.out.print(value));

上面的程式碼先建立了一個 List 物件並初始化,然後使用 map 方法將集合的 Integer 元素轉換成 String ,再使用 collect(toList()) 方法生成一個新的 List 集合,最用 forEach 遍歷集合列印集合元素。

  • flatMap 方法的使用
List<String> list = Arrays.asList("abc", "def", "ghi");
List<Character> result = list.stream().flatMap(value -> {
char[] chars = value.toCharArray();
Character[] characters = new Character[chars.length];
for(int i = 0; i < characters.length; i++){
characters[i] = chars[i];
}
return Stream.of(characters);
}).collect(toList());
result.forEach((value) -> System.out.print(value));

上面程式碼先遍歷 list ,通過 flatMap 方法將每個 String 元素都生成一個新的 Stream 並將這些 Stream 連線成一個新的 Stream

  • max 和 min 方法的使用
List<Integer> list = Arrays.asList(0, 1, 2, 3);
Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);
System.out.println(list.stream().min(comparator).get());
System.out.println(list.stream().max(comparator).get());

min 和 max 方法需要一個 Comparator 物件為引數作為比對依據。

  • reduce 方法的使用

reduce 方法的用途非常廣泛,作用也比較大

List<Integer> list = Arrays.asList(0, 1, 2, 3);
int count = list.stream().reduce(0, (acc, item) -> acc + item).intValue();
System.out.println(count);

reduce 方法的一個引數為迴圈的初始值,這裡計算累加時初始值為 0,acc 代表已經計算的結果,item 表示迴圈的每個元素

總結

Stream 流是 JDK 8 新特性中用於簡化集合類的使用,可以讓程式碼看起來更加簡潔乾淨。