<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
我們日常工作中,Lambda
使用比較多的場景,就是集合類下的 Lambda 流操作,往往幾行程式碼可以幫助我們實現複雜程式碼
接下來我們把 Lambda
流的常用方法用案列講解一下。
集合的遍歷forEach方法:
public void testForEach(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.forEach(s-> System.out.println(s)); }
將操作後的物件轉化為新的物件
public void testCollect(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("2"); }}; //轉換為新的list List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList()); }
Filter 為過濾的意思,只要滿足 Filter 表示式的資料就可以留下來,不滿足的資料被過濾掉
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()); }
map 方法可以讓我們進行一些流的轉化,比如原來流中的元素是 A,通過 map 操作,可以使返回的流中的元素是 B
public void testMap() { List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; //通過 map 方法list中元素轉化成 小寫 List<String> strLowerList = list.stream() .map(str -> str.toLowerCase()) .collect(Collectors.toList()); }
mapToInt 方法的功能和 map 方法一樣,只不過 mapToInt 返回的結果已經沒有泛型,已經明確是 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,因為已經確定是 int 型別了 // 所有沒有泛型的,而 Collectors.toList() 強制要求有泛型的流,所以需要使用 mapToObj // 方法返回有泛型的流 .mapToObj(s->s) .collect(Collectors.toList()); list.stream() .mapToDouble(s->Double.valueOf(s)) // DoubleStream/IntStream 有許多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法 .sum(); }
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()); }
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()); }
groupingBy 是能夠根據欄位進行分組,toMap 是把 List 的資料格式轉化成 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"; } })); }
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 裡的內容 .orElse("3"); Optional<String> str= list.stream() .filter(s->"2".equals(s)) .findFirst(); // isPresent 為 true 的話,表示 value != null if(str.isPresent()){ return; } }
reduce 方法允許我們在迴圈裡面疊加計算值
public void testReduce(){ List<String> list = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}; list.stream() .map(s -> Integer.valueOf(s)) // s1 和 s2 表示迴圈中的前後兩個數 .reduce((s1,s2) -> s1+s2) .orElse(0); list.stream() .map(s -> Integer.valueOf(s)) // 第一個參數列示基數,會從 100 開始加 .reduce(100,(s1,s2) -> s1+s2); }
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()); }
limit 方法會限制輸出值個數,入參是限制的個數大小
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()); }
通過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 表示式常用的方法
懂這些,這樣我們在工作中遇到複雜資料結構轉化時,肯定會得心應手了。
到此這篇關於Java中常用的Lambda表示式案例解析的文章就介紹到這了,更多相關Java Lambda表示式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45