java 8 新特性 stream

之前寫代碼一直用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 + ", "));

結果:

image.png

參考鏈接:https://www.cnblogs.com/song27/p/7697713.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。