作者:堅持就是勝利
來源: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() {
Listlist = 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() {
Listlist = 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() {
Listlist = 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,你會有不一樣的體驗。