Java中常用的Lambda表達(dá)式案例解析
前言:
我們?nèi)粘9ぷ髦校?code>Lambda 使用比較多的場(chǎng)景,就是集合類下的 Lambda 流操作,往往幾行代碼可以幫助我們實(shí)現(xiàn)復(fù)雜代碼
接下來(lái)我們把 Lambda
流的常用方法用案列講解一下。
1、ForEach
集合的遍歷forEach方法:
public void testForEach(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.forEach(s-> System.out.println(s)); }
2、Collect
將操作后的對(duì)象轉(zhuǎn)化為新的對(duì)象
public void testCollect(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; //轉(zhuǎn)換為新的list List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList()); }
3、Filter
Filter 為過(guò)濾的意思,只要滿足 Filter 表達(dá)式的數(shù)據(jù)就可以留下來(lái),不滿足的數(shù)據(jù)被過(guò)濾掉
public void testFilter() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() // 過(guò)濾掉我們希望留下來(lái)的值 // 表示我們希望字符串是 1 能留下來(lái) // 其他的過(guò)濾掉 .filter(str -> "1".equals(str)) .collect(Collectors.toList()); }
4、Map
map 方法可以讓我們進(jìn)行一些流的轉(zhuǎn)化,比如原來(lái)流中的元素是 A,通過(guò) map 操作,可以使返回的流中的元素是 B
public void testMap() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; //通過(guò) map 方法list中元素轉(zhuǎn)化成 小寫(xiě) List<String> strLowerList = list.stream() .map(str -> str.toLowerCase()) .collect(Collectors.toList()); }
5、MapToInt
mapToInt 方法的功能和 map 方法一樣,只不過(guò) mapToInt 返回的結(jié)果已經(jīng)沒(méi)有泛型,已經(jīng)明確是 int 類型的流了,源碼如下:
public void testMapToInt() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() .mapToInt(s->Integer.valueOf(s)) // 一定要有 mapToObj,因?yàn)?mapToInt 返回的是 IntStream,因?yàn)橐呀?jīng)確定是 int 類型了 // 所有沒(méi)有泛型的,而 Collectors.toList() 強(qiáng)制要求有泛型的流,所以需要使用 mapToObj // 方法返回有泛型的流 .mapToObj(s->s) .collect(Collectors.toList()); list.stream() .mapToDouble(s->Double.valueOf(s)) // DoubleStream/IntStream 有許多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法 .sum(); }
6、Distinct
distinct 方法有去重的功能
public void testDistinct(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; list.stream() .map(s -> Integer.valueOf(s)) .distinct() .collect(Collectors.toList()); }
7、Sorted
Sorted 方法提供了排序的功能,并且允許我們自定義排序
public void testSorted(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() .map(s -> Integer.valueOf(s)) // 等同于 .sorted(Comparator.naturalOrder()) 自然排序 .sorted() .collect(Collectors.toList()); // 自定義排序器 list.stream() .map(s -> Integer.valueOf(s)) // 反自然排序 .sorted(Comparator.reverseOrder()) .collect(Collectors.toList()); }
8、groupingBy
groupingBy 是能夠根據(jù)字段進(jìn)行分組,toMap 是把 List 的數(shù)據(jù)格式轉(zhuǎn)化成 Map 的格式
public void testGroupBy(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> { if("2".equals(s)) { return "2"; }else { return "1"; } })); }
9、FindFirst
findFirst 表示匹配到第一個(gè)滿足條件的值就返回
public void testFindFirst(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; list.stream() .filter(s->"2".equals(s)) .findFirst() .get(); // 防止空指針 list.stream() .filter(s->"2".equals(s)) .findFirst() // orElse 表示如果 findFirst 返回 null 的話,就返回 orElse 里的內(nèi)容 .orElse("3"); Optional<String> str= list.stream() .filter(s->"2".equals(s)) .findFirst(); // isPresent 為 true 的話,表示 value != null if(str.isPresent()){ return; } }
10、Reduce
reduce 方法允許我們?cè)谘h(huán)里面疊加計(jì)算值
public void testReduce(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() .map(s -> Integer.valueOf(s)) // s1 和 s2 表示循環(huán)中的前后兩個(gè)數(shù) .reduce((s1,s2) -> s1+s2) .orElse(0); list.stream() .map(s -> Integer.valueOf(s)) // 第一個(gè)參數(shù)表示基數(shù),會(huì)從 100 開(kāi)始加 .reduce(100,(s1,s2) -> s1+s2); }
11、Peek
peek 方法很簡(jiǎn)單,我們?cè)?peek 方法里面做任意沒(méi)有返回值的事情,比如打印日志
public void testPeek(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream().map(s -> Integer.valueOf(s)) .peek(s -> System.out.println(s)) .collect(Collectors.toList()); }
12、Limit
limit 方法會(huì)限制輸出值個(gè)數(shù),入?yún)⑹窍拗频膫€(gè)數(shù)大小
public void testLimit(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() .map(s -> Integer.valueOf(s)) .limit(2L) .collect(Collectors.toList()); }
13、Max,Min
通過(guò)max、min方法,可以獲取集合中最大、最小的對(duì)象
public void testMaxMin(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get(); list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get(); }
總結(jié)
本文我們介紹十幾種 Lambda 表達(dá)式常用的方法
懂這些,這樣我們?cè)诠ぷ髦杏龅綇?fù)雜數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化時(shí),肯定會(huì)得心應(yīng)手了。
到此這篇關(guān)于Java中常用的Lambda表達(dá)式案例解析的文章就介紹到這了,更多相關(guān)Java Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java?Lambda表達(dá)式常用的函數(shù)式接口
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- Java使用lambda自定義Arrays.sort排序規(guī)則說(shuō)明
- Java中Lambda表達(dá)式的使用詳細(xì)教程
- Java?中的?Lambda?List?轉(zhuǎn)?Map?的多種方法詳解
- Java匿名內(nèi)部類和Lambda(->) 的多種寫(xiě)法總結(jié)
- Java?lambda表達(dá)式與泛型整理總結(jié)
- Java8如何利用Lambda快速生成map、多層嵌套map
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java Lambda表達(dá)式詳解
相關(guān)文章
Java?Request獲取請(qǐng)求頭數(shù)據(jù)實(shí)例詳解
在開(kāi)發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過(guò)地址來(lái)實(shí)現(xiàn)一些功能,下面這篇文章主要給大家介紹了關(guān)于Java中Request獲取請(qǐng)求頭數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式,java復(fù)制文件的方式其實(shí)有不少種,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Springboot+Shiro+Jwt實(shí)現(xiàn)權(quán)限控制的項(xiàng)目實(shí)踐
如今的互聯(lián)網(wǎng)已經(jīng)成為前后端分離的時(shí)代,所以本文在使用SpringBoot整合Shiro框架的時(shí)候會(huì)聯(lián)合JWT一起搭配使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問(wèn)題的解決方案
這篇文章主要介紹了關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問(wèn)題的解決方案,線程池復(fù)用線程,如果子線程執(zhí)行完未移除上下文,則會(huì)導(dǎo)致后續(xù)線程可以取到之前線程設(shè)置的屬性,需要的朋友可以參考下2023-11-11