Java中常用的Lambda表達式案例解析
前言:
我們?nèi)粘9ぷ髦校?code>Lambda 使用比較多的場景,就是集合類下的 Lambda 流操作,往往幾行代碼可以幫助我們實現(xiàn)復雜代碼
接下來我們把 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
將操作后的對象轉(zhuǎn)化為新的對象
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 為過濾的意思,只要滿足 Filter 表達式的數(shù)據(jù)就可以留下來,不滿足的數(shù)據(jù)被過濾掉
public void testFilter() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() // 過濾掉我們希望留下來的值 // 表示我們希望字符串是 1 能留下來 // 其他的過濾掉 .filter(str -> "1".equals(str)) .collect(Collectors.toList()); }
4、Map
map 方法可以讓我們進行一些流的轉(zhuǎn)化,比如原來流中的元素是 A,通過 map 操作,可以使返回的流中的元素是 B
public void testMap() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; //通過 map 方法list中元素轉(zhuǎn)化成 小寫 List<String> strLowerList = list.stream() .map(str -> str.toLowerCase()) .collect(Collectors.toList()); }
5、MapToInt
mapToInt 方法的功能和 map 方法一樣,只不過 mapToInt 返回的結果已經(jīng)沒有泛型,已經(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,因為 mapToInt 返回的是 IntStream,因為已經(jīng)確定是 int 類型了 // 所有沒有泛型的,而 Collectors.toList() 強制要求有泛型的流,所以需要使用 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ù)字段進行分組,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 表示匹配到第一個滿足條件的值就返回
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 方法允許我們在循環(huán)里面疊加計算值
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)中的前后兩個數(shù) .reduce((s1,s2) -> s1+s2) .orElse(0); list.stream() .map(s -> Integer.valueOf(s)) // 第一個參數(shù)表示基數(shù),會從 100 開始加 .reduce(100,(s1,s2) -> s1+s2); }
11、Peek
peek 方法很簡單,我們在 peek 方法里面做任意沒有返回值的事情,比如打印日志
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 方法會限制輸出值個數(shù),入?yún)⑹窍拗频膫€數(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
通過max、min方法,可以獲取集合中最大、最小的對象
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(); }
總結
本文我們介紹十幾種 Lambda 表達式常用的方法
懂這些,這樣我們在工作中遇到復雜數(shù)據(jù)結構轉(zhuǎn)化時,肯定會得心應手了。
到此這篇關于Java中常用的Lambda表達式案例解析的文章就介紹到這了,更多相關Java Lambda表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java?Lambda表達式常用的函數(shù)式接口
- Java詳細分析Lambda表達式與Stream流的使用方法
- Java使用lambda自定義Arrays.sort排序規(guī)則說明
- Java中Lambda表達式的使用詳細教程
- Java?中的?Lambda?List?轉(zhuǎn)?Map?的多種方法詳解
- Java匿名內(nèi)部類和Lambda(->) 的多種寫法總結
- Java?lambda表達式與泛型整理總結
- Java8如何利用Lambda快速生成map、多層嵌套map
- Java分析Lambda表達式Stream流合并分組內(nèi)對象數(shù)據(jù)合并
- Java Lambda表達式詳解
相關文章
Java?Request獲取請求頭數(shù)據(jù)實例詳解
在開發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過地址來實現(xiàn)一些功能,下面這篇文章主要給大家介紹了關于Java中Request獲取請求頭數(shù)據(jù)的相關資料,需要的朋友可以參考下2024-01-01Springboot+Shiro+Jwt實現(xiàn)權限控制的項目實踐
如今的互聯(lián)網(wǎng)已經(jīng)成為前后端分離的時代,所以本文在使用SpringBoot整合Shiro框架的時候會聯(lián)合JWT一起搭配使用,具有一定的參考價值,感興趣的可以了解一下2023-09-09Java利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏,首先在需要進行脫敏的VO字段上面標注相關脫敏注解,具體實例代碼文中給大家介紹的非常詳細,需要的朋友可以參考下2021-10-10關于TransmittableThreadLocal線程池中線程復用問題的解決方案
這篇文章主要介紹了關于TransmittableThreadLocal線程池中線程復用問題的解決方案,線程池復用線程,如果子線程執(zhí)行完未移除上下文,則會導致后續(xù)線程可以取到之前線程設置的屬性,需要的朋友可以參考下2023-11-11