之前寫代碼一直用for循環(huán)以及if判斷來處理大部分內(nèi)容无拗,正可謂屢試不爽梁只,但是后面看到大佬們寫的代碼挫鸽,用到了java8新特性lambda表達(dá)式说敏、stream流操作處理集合,剛開始閱讀代碼時(shí)由于不太了解丢郊,看不懂做了什么操作像云,一大串代碼結(jié)束就解決了很多問題,代碼很簡潔很規(guī)范蚂夕。再反過來看看for循環(huán)和各種if判斷迅诬,雖然很親和,很易懂婿牍,但是代碼量絕對(duì)的充實(shí)侈贷,并且有時(shí)候在一個(gè)方法中頻繁的使用for循環(huán)和if判斷,雖然自己寫的明明白白等脂,但是讀者看得腦闊疼俏蛮,后面自己也慢慢的開始使用stream來處理一些代碼,往往五六行代碼的for循環(huán)和if判斷使用用stream處理一行代碼就搞定了上遥,下面總結(jié)一下有關(guān)java8 新特性stream的語法搏屑。
stream簡單介紹
Java 8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利粉楚、高效的聚合操作(aggregate operation)辣恋,或者大批量數(shù)據(jù)操作 (bulk data operation)。Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式模软,極大的提高編程效率和程序可讀性伟骨。同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢(shì)
語法
1燃异、distinct 去重
distinct方法是對(duì)stream流中包含的元素進(jìn)行去重携狭,生成新的stream
List<String> list = Arrays.asList("悟空","巨無霸","擎天柱","悟空","大黃蜂");
//去重后轉(zhuǎn)化為list集合
list = list.stream().distinct().collect(Collectors.toList());
//利用forech循環(huán)輸出集合元素
list.forEach(System.out::println);
2、filter 過濾
filter方法是根據(jù)設(shè)置的條件來過濾回俐、篩選出所需要的元素
List<String> list = Arrays.asList("","","擎天柱","","大黃蜂");
//過濾掉空字符串
List<String> filterList = list.stream().filter(str -> !"".equals(str)).collect(Collectors.toList());
//獲取不為空字符串的數(shù)量
Long count = list.stream().filter(str -> !"".equals(str)).count();
3逛腿、map 根據(jù)指定的函數(shù)進(jìn)行轉(zhuǎn)化
map方法是對(duì)于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換操作稀并,新生成的Stream只包含轉(zhuǎn)換生成的元素
List<Integer> integerList = Arrays.asList(10, 20, null, 30, 40, 50);
//獲取不為空的元素、對(duì)每個(gè)元素乘以2
integerList = integerList.stream().filter(x -> x != null).map(x -> x * 2).collect(Collectors.toList());
List<String> mapList = Arrays.asList("a","B", "C","qwer");
//將集合中的所有字符串元素轉(zhuǎn)化成大寫的字符串輸入
mapList.stream().map( x -> x.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);
4单默、limit 獲取指定數(shù)量的元素
limit方法是根據(jù)設(shè)定的數(shù)量從流中獲取對(duì)應(yīng)數(shù)量的元素
List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取集合中的前三個(gè)字符串
List<String> limitList = list.stream().limit(3).collect(Collectors.toList());
limitList.forEach(System.out::println);
5碘举、skip 獲取去除指定數(shù)量之后的元素
skip方法與limt有點(diǎn)區(qū)別,此方法是獲取到根據(jù)設(shè)定的數(shù)量n去除掉集合中前n個(gè)元素之后的所有數(shù)據(jù)
List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取到去除集合中前三個(gè)字符串之后的所有字符串
List<String> skipList = list.stream().skip(3).collect(Collectors.toList());
skipList.forEach(System.out::println);
6雕凹、 sorted 排序
sorted方法是對(duì)流中的元素進(jìn)行排序殴俱,降序和升序都可以使用自然排序的方法政冻,也可以調(diào)用Comparator中的方法進(jìn)行排序
List<Integer> sortList = Arrays.asList(10, 40, 30, 50, 60);
//對(duì)集合中的元素進(jìn)行升序排序
List<Integer> ascSortList = sortList.stream().sorted().collect(Collectors.toList());
//使用Comparator提供的comparing進(jìn)行升序排序
List<Integer> ascSortLists = sortList.stream().sorted(Comparator.comparing(x -> x )).collect(Collectors.toList());
//對(duì)集合中的元素進(jìn)行倒序排序
List<Integer> descSortList = sortList.stream().sorted((x1, x2) -> x2.compareTo(x1)).collect(Collectors.toList());
//使用Comparator 提供的reverseOrder() 方法進(jìn)行倒序排序
List<Integer> descSortLists = sortList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
7枚抵、peek
peek 方法是生成一個(gè)包含原Stream的所有元素的新Stream,同時(shí)會(huì)提供一個(gè)消費(fèi)函數(shù)(Consumer實(shí)例)明场,新Stream每個(gè)元素被消費(fèi)的時(shí)候都會(huì)執(zhí)行給定的消費(fèi)函數(shù)
注:剛開始以為peek與map的用法一樣汽摹,后面通過學(xué)習(xí)及練習(xí),peek方法其實(shí)是沒有返回值的苦锨,多半用于一些輸出逼泣,數(shù)據(jù)的校驗(yàn)等
List<Integer> peekList = Arrays.asList(10, 40, 30, 50, 60);
//打印集合中的元素
List<Integer> peekLists = peekList.stream().peek(System.out::println).collect(Collectors.toList());
//判斷集合中是否有等于30的元素,并且獲取前三個(gè)元素之后的所有元素
List<Integer> peekList1 = peekList.stream().peek(x -> {
if (x == 30) {
System.out.println("集合中有30");
}
}).skip(3).collect(Collectors.toList());
peekList1.forEach(System.out::println);
一個(gè)總結(jié)例子使用以上的所有方法
//需求:給定一個(gè)Integer類型的List舟舒,通過各種處理獲取最終的一個(gè)集合
// 1拉庶、過濾掉null
// 2、去重
// 3秃励、每個(gè)元素乘以2
// 4氏仗、每個(gè)元素被消費(fèi)的時(shí)候打印自身
// 5、跳過前三個(gè)元素
// 6夺鲜、獲取剩下元素中的前五個(gè)元素
// 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 + ", "));
結(jié)果:
參考鏈接:https://www.cnblogs.com/song27/p/7697713.html