巧用Java8中的Stream,讓集合操作飛起來

2019-08-29     程式設計師聖經
作者:堅持就是勝利
來源:juejin.im/post/5d5e2616f265da03b638b28a

簡介

java8也出來好久了,接口默認方法,lambda表達式,函數式接口,Date API等特性還是有必要去了解一下。比如在項目中經常用到集合,遍歷集合可以試下lambda表達式,經常還要對集合進行過濾和排序,Stream就派上用場了。用習慣了,不得不說真的很好用。

Stream作為java8的新特性,基於lambda表達式,是對集合對象功能的增強,它專注於對集合對象進行各種高效、便利的聚合操作或者大批量的數據操作,提高了編程效率和代碼可讀性。

Stream的原理:將要處理的元素看做一種流,流在管道中傳輸,並且可以在管道的節點上處理,包括過濾篩選、去重、排序、聚合等。元素流在管道中經過中間操作的處理,最後由最終操作得到前面處理的結果。

集合有兩種方式生成流:

  • stream() − 為集合創建串行流
  • parallelStream() - 為集合創建並行流




上圖中是Stream類的類結構圖,裡面包含了大部分的中間和終止操作。

中間操作主要有以下方法(此類型方法返回的都是Stream):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

終止操作主要有以下方法:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

舉例說明

首先為了說明Stream對對象集合的操作,新建一個Student類(學生類),覆寫了equals()和hashCode()方法

filter(篩選)

運行結果:

這裡我們創建了四個學生,經過filter的篩選,篩選出地址是浙江的學生集合。

map(轉換)

運行結果

map就是將對應的元素按照給定的方法進行轉換。

distinct(去重)

運行結果:

運行結果:



可以看出,兩個重複的「肖戰」同學進行了去重,這不僅因為使用了distinct()方法,而且因為Student對象重寫了equals和hashCode()方法,否則去重是無效的。

sorted(排序)

 public static void main(String [] args) {
testSort1();
}
/**
* 集合排序(默認排序)
*/
private static void testSort1() {
List list = Arrays.asList("333","222","111");
list.stream().sorted().forEach(System.out::println);
}

運行結果:

運行結果:



上面指定排序規則,先按照學生的id進行降序排序,再按照年齡進行降序排序

limit(限制返回個數)

運行結果:



skip(刪除元素)

 public static void main(String [] args) {
testSkip();
}
/**
* 集合skip,刪除前n個元素
*/
private static void testSkip() {
List list = Arrays.asList("333","222","111");
list.stream().skip(2).forEach(System.out::println);
}

運行結果:



reduce(聚合)

 public static void main(String [] args) {
testReduce();
}
/**
* 集合reduce,將集合中每個元素聚合成一條數據
*/
private static void testReduce() {
List list = Arrays.asList("歡","迎","你");
String appendStr = list.stream().reduce("北京",(a,b) -> a+b);
System.out.println(appendStr);
}

運行結果:



min(求最小值)

運行結果:



上面是求所有學生中年齡最小的一個,max同理,求最大值。

anyMatch/allMatch/noneMatch(匹配)

運行結果:



anyMatch:Stream 中任意一個元素符合傳入的 predicate,返回 true

allMatch:Stream 中全部元素符合傳入的 predicate,返回 true

noneMatch:Stream 中沒有一個元素符合傳入的 predicate,返回 true

總結

上面介紹了Stream常用的一些方法,雖然對集合的遍歷和操作可以用以前常規的方式,但是當業務邏輯複雜的時候,你會發現代碼量很多,可讀性很差,明明一行代碼解決的事情,你卻寫了好幾行。試試lambda表達式,試試Stream,你會有不一樣的體驗。

文章來源: https://twgreatdaily.com/zh/S_bE4WwBJleJMoPMFSGl.html