之前寫代碼一直用for循環以及if判斷來處理大部分內容,正可謂屢試不爽,但是后面看到大佬們寫的代碼,用到了java8新特性lambda表達式、stream流操作處理集合,剛開始閱讀代碼時由于不太了解,看不懂做了什么操作,一大串代碼結束就解決了很多問題,代碼很簡潔很規范。再反過來看看for循環和各種if判斷,雖然很親和,很易懂,但是代碼量絕對的充實,并且有時候在一個方法中頻繁的使用for循環和if判斷,雖然自己寫的明明白白,但是讀者看得腦闊疼,后面自己也慢慢的開始使用stream來處理一些代碼,往往五六行代碼的for循環和if判斷使用用stream處理一行代碼就搞定了,下面總結一下有關java8 新特性stream的語法。
stream簡單介紹
Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注于對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。Stream API 借助于同樣新出現的 Lambda 表達式,極大的提高編程效率和程序可讀性。同時它提供串行和并行兩種模式進行匯聚操作,并發模式能夠充分利用多核處理器的優勢
語法
1、distinct 去重
distinct方法是對stream流中包含的元素進行去重,生成新的stream
List<String> list = Arrays.asList("悟空","巨無霸","擎天柱","悟空","大黃蜂");
//去重后轉化為list集合
list = list.stream().distinct().collect(Collectors.toList());
//利用forech循環輸出集合元素
list.forEach(System.out::println);
2、filter 過濾
filter方法是根據設置的條件來過濾、篩選出所需要的元素
List<String> list = Arrays.asList("","","擎天柱","","大黃蜂");
//過濾掉空字符串
List<String> filterList = list.stream().filter(str -> !"".equals(str)).collect(Collectors.toList());
//獲取不為空字符串的數量
Long count = list.stream().filter(str -> !"".equals(str)).count();
3、map 根據指定的函數進行轉化
map方法是對于Stream中包含的元素使用給定的轉換函數進行轉換操作,新生成的Stream只包含轉換生成的元素
List<Integer> integerList = Arrays.asList(10, 20, null, 30, 40, 50);
//獲取不為空的元素、對每個元素乘以2
integerList = integerList.stream().filter(x -> x != null).map(x -> x * 2).collect(Collectors.toList());
List<String> mapList = Arrays.asList("a","B", "C","qwer");
//將集合中的所有字符串元素轉化成大寫的字符串輸入
mapList.stream().map( x -> x.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);
4、limit 獲取指定數量的元素
limit方法是根據設定的數量從流中獲取對應數量的元素
List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取集合中的前三個字符串
List<String> limitList = list.stream().limit(3).collect(Collectors.toList());
limitList.forEach(System.out::println);
5、skip 獲取去除指定數量之后的元素
skip方法與limt有點區別,此方法是獲取到根據設定的數量n去除掉集合中前n個元素之后的所有數據
List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取到去除集合中前三個字符串之后的所有字符串
List<String> skipList = list.stream().skip(3).collect(Collectors.toList());
skipList.forEach(System.out::println);
6、 sorted 排序
sorted方法是對流中的元素進行排序,降序和升序都可以使用自然排序的方法,也可以調用Comparator中的方法進行排序
List<Integer> sortList = Arrays.asList(10, 40, 30, 50, 60);
//對集合中的元素進行升序排序
List<Integer> ascSortList = sortList.stream().sorted().collect(Collectors.toList());
//使用Comparator提供的comparing進行升序排序
List<Integer> ascSortLists = sortList.stream().sorted(Comparator.comparing(x -> x )).collect(Collectors.toList());
//對集合中的元素進行倒序排序
List<Integer> descSortList = sortList.stream().sorted((x1, x2) -> x2.compareTo(x1)).collect(Collectors.toList());
//使用Comparator 提供的reverseOrder() 方法進行倒序排序
List<Integer> descSortLists = sortList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
7、peek
peek 方法是生成一個包含原Stream的所有元素的新Stream,同時會提供一個消費函數(Consumer實例),新Stream每個元素被消費的時候都會執行給定的消費函數
注:剛開始以為peek與map的用法一樣,后面通過學習及練習,peek方法其實是沒有返回值的,多半用于一些輸出,數據的校驗等
List<Integer> peekList = Arrays.asList(10, 40, 30, 50, 60);
//打印集合中的元素
List<Integer> peekLists = peekList.stream().peek(System.out::println).collect(Collectors.toList());
//判斷集合中是否有等于30的元素,并且獲取前三個元素之后的所有元素
List<Integer> peekList1 = peekList.stream().peek(x -> {
if (x == 30) {
System.out.println("集合中有30");
}
}).skip(3).collect(Collectors.toList());
peekList1.forEach(System.out::println);
一個總結例子使用以上的所有方法
//需求:給定一個Integer類型的List,通過各種處理獲取最終的一個集合
// 1、過濾掉null
// 2、去重
// 3、每個元素乘以2
// 4、每個元素被消費的時候打印自身
// 5、跳過前三個元素
// 6、獲取剩下元素中的前五個元素
// 7、倒序排序
Integer[] integersArr = new Integer[]{1, 2, null, 2, 3, 4, null, 5, 6, 7, 8, 9, 10};
List<Integer> integerList = Arrays.asList(integersArr);
integerList = integerList.stream().
filter(x -> x != null).
distinct().
map(x -> x * 2).
peek(System.out::println).
skip(3).
limit(5).
sorted(Comparator.reverseOrder()).
collect(Collectors.toList());
integerList.forEach(num -> System.out.print(num + ", "));
結果:
參考鏈接:https://www.cnblogs.com/song27/p/7697713.html