精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用Lambda表達式寫代碼,開發速度提高了10倍!

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-30 10:38 ? 次閱讀


前言

日常開發中,我們很多時候需要用到Java 8Lambda表達式,它允許把函數作為一個方法的參數,讓我們的代碼更優雅、更簡潔。所以整理了一波工作中,我常用的,有哪些Lambda表達式。看完一定會有幫助的。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

1. list 轉 map

工作中,我們經常遇到listmap的案例。Collectors.toMap就可以把一個list數組轉成一個Map。代碼如下:

publicclassTestLambda{

publicstaticvoidmain(String[]args){

ListuserInfoList=newArrayList<>();
userInfoList.add(newUserInfo(1L,"芋道源碼",18));
userInfoList.add(newUserInfo(2L,"程序員芋艿",27));
userInfoList.add(newUserInfo(2L,"打代碼的芋艿",26));

/**
*list轉map
*使用Collectors.toMap的時候,如果有可以重復會報錯,所以需要加(k1,k2)->k1
*(k1,k2)->k1表示,如果有重復的key,則保留第一個,舍棄第二個
*/
MapuserInfoMap=userInfoList.stream().collect(Collectors.toMap(UserInfo::getUserId,userInfo->userInfo,(k1,k2)->k1));
userInfoMap.values().forEach(a->System.out.println(a.getUserName()));
}
}

//運行結果
芋道源碼
程序員芋艿

類似的,還有Collectors.toList()Collectors.toSet(),表示把對應的流轉化為list或者Set

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

2. filter()過濾

從數組集合中,過濾掉不符合條件的元素,留下符合條件的元素。

ListuserInfoList=newArrayList<>();
userInfoList.add(newUserInfo(1L,"芋道源碼",18));
userInfoList.add(newUserInfo(2L,"程序員芋艿",27));
userInfoList.add(newUserInfo(3L,"打代碼的芋艿",26));

/**
*filter過濾,留下超過18歲的用戶
*/
ListuserInfoResultList=userInfoList.stream().filter(user->user.getAge()>18).collect(Collectors.toList());
userInfoResultList.forEach(a->System.out.println(a.getUserName()));

//運行結果
程序員芋艿
打代碼的芋艿

3. foreach 遍歷

foreach 遍歷list,遍歷map,真的很絲滑。

/**
*forEach遍歷集合List列表
*/
ListuserNameList=Arrays.asList("芋道源碼","程序員芋艿","艿艿");
userNameList.forEach(System.out::println);

HashMaphashMap=newHashMap<>();
hashMap.put("公眾號","芋道源碼");
hashMap.put("職業","程序員芋艿");
hashMap.put("昵稱","艿艿");
/**
*forEach遍歷集合Map
*/
hashMap.forEach((k,v)->System.out.println(k+":	"+v));

//運行結果
芋道源碼
程序員芋艿
打代碼的芋艿
職業:程序員芋艿
公眾號:芋道源碼
昵稱:艿艿

4. groupingBy 分組

提到分組,相信大家都會想起SQLgroup by。我們經常需要一個List做分組操作。比如,按城市分組用戶。在Java8之前,是這么實現的:

ListoriginUserInfoList=newArrayList<>();
originUserInfoList.add(newUserInfo(1L,"芋道源碼",18,"深圳"));

originUserInfoList.add(newUserInfo(3L,"打代碼的芋艿",26,"湛江"));
originUserInfoList.add(newUserInfo(2L,"程序員芋艿",27,"深圳"));
Map>result=newHashMap<>();
for(UserInfouserInfo:originUserInfoList){
Stringcity=userInfo.getCity();
ListuserInfos=result.get(city);
if(userInfos==null){
userInfos=newArrayList<>();
result.put(city,userInfos);
}
userInfos.add(userInfo);
}

而使用Java8的groupingBy分組器,清爽無比:

Map>result=originUserInfoList.stream()
.collect(Collectors.groupingBy(UserInfo::getCity));

5. sorted+Comparator 排序

工作中,排序的需求比較多,使用sorted+Comparator排序,真的很香。

ListuserInfoList=newArrayList<>();
userInfoList.add(newUserInfo(1L,"芋道源碼",18));
userInfoList.add(newUserInfo(3L,"打代碼的芋艿",26));
userInfoList.add(newUserInfo(2L,"程序員芋艿",27));

/**
*sorted+Comparator.comparing排序列表,
*/
userInfoList=userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge)).collect(Collectors.toList());
userInfoList.forEach(a->System.out.println(a.toString()));

System.out.println("開始降序排序");

/**
*如果想降序排序,則可以使用加reversed()
*/
userInfoList=userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge).reversed()).collect(Collectors.toList());
userInfoList.forEach(a->System.out.println(a.toString()));

//運行結果
UserInfo{userId=1,userName='芋道源碼',age=18}
UserInfo{userId=3,userName='打代碼的芋艿',age=26}
UserInfo{userId=2,userName='程序員芋艿',age=27}
開始降序排序
UserInfo{userId=2,userName='程序員芋艿',age=27}
UserInfo{userId=3,userName='打代碼的芋艿',age=26}
UserInfo{userId=1,userName='芋道源碼',age=18}

6.distinct 去重

distinct可以去除重復的元素:

Listlist=Arrays.asList("A","B","F","A","C");
Listtemp=list.stream().distinct().collect(Collectors.toList());
temp.forEach(System.out::println);

7. findFirst 返回第一個

findFirst 很多業務場景,我們只需要返回集合的第一個元素即可:

Listlist=Arrays.asList("A","B","F","A","C");
list.stream().findFirst().ifPresent(System.out::println);

8. anyMatch 是否至少匹配一個元素

anyMatch 檢查流是否包含至少一個滿足給定謂詞的元素。

Streamstream=Stream.of("A","B","C","D");
booleanmatch=stream.anyMatch(s->s.contains("C"));
System.out.println(match);
//輸出
true

9. allMatch 匹配所有元素

allMatch 檢查流是否所有都滿足給定謂詞的元素。

Streamstream=Stream.of("A","B","C","D");
booleanmatch=stream.allMatch(s->s.contains("C"));
System.out.println(match);
//輸出
false

10. map 轉換

map方法可以幫我們做元素轉換,比如一個元素所有字母轉化為大寫,又或者把獲取一個元素對象的某個屬性,demo如下:

Listlist=Arrays.asList("jay","tianluo");
//轉化為大寫
ListupperCaselist=list.stream().map(String::toUpperCase).collect(Collectors.toList());
upperCaselist.forEach(System.out::println);

11. Reduce

Reduce可以合并流的元素,并生成一個值

intsum=Stream.of(1,2,3,4).reduce(0,(a,b)->a+b);
System.out.println(sum);

12. peek 打印個日志

peek()方法是一個中間Stream操作,有時候我們可以使用peek來打印日志。

Listresult=Stream.of("程序員芋艿","芋道源碼","打代碼的芋艿")
.filter(a->a.contains("芋艿"))
.peek(a->System.out.println("關注公眾號:"+a)).collect(Collectors.toList());
System.out.println(result);
//運行結果
關注公眾號:程序員芋艿
關注公眾號:芋道源碼
[程序員芋艿,芋道源碼]

13. Max,Min 最大最小

使用lambda流求最大,最小值,非常方便。

ListuserInfoList=newArrayList<>();
userInfoList.add(newUserInfo(1L,"芋道源碼",18));
userInfoList.add(newUserInfo(3L,"打代碼的芋艿",26));
userInfoList.add(newUserInfo(2L,"程序員芋艿",27));

OptionalmaxAgeUserInfoOpt=userInfoList.stream().max(Comparator.comparing(UserInfo::getAge));
maxAgeUserInfoOpt.ifPresent(userInfo->System.out.println("maxageuser:"+userInfo));

OptionalminAgeUserInfoOpt=userInfoList.stream().min(Comparator.comparing(UserInfo::getAge));
minAgeUserInfoOpt.ifPresent(userInfo->System.out.println("minageuser:"+userInfo));

//運行結果
maxageuser:UserInfo{userId=2,userName='程序員芋艿',age=27}
minageuser:UserInfo{userId=1,userName='芋道源碼',age=18}

14. count 統計

一般count()表示獲取流數據元素總數。

ListuserInfoList=newArrayList<>();
userInfoList.add(newUserInfo(1L,"芋道源碼",18));
userInfoList.add(newUserInfo(3L,"打代碼的芋艿",26));
userInfoList.add(newUserInfo(2L,"程序員芋艿",27));

longcount=userInfoList.stream().filter(user->user.getAge()>18).count();
System.out.println("大于18歲的用戶:"+count);
//輸出
大于18歲的用戶:2

15. 常用函數式接口

其實lambda離不開函數式接口,我們來看下JDK8常用的幾個函數式接口:

  • Function(轉換型): 接受一個輸入參數,返回一個結果
  • Consumer (消費型): 接收一個輸入參數,并且無返回操作
  • Predicate (判斷型): 接收一個輸入參數,并且返回布爾值結果
  • Supplier (供給型): 無參數,返回結果

Function 是一個功能轉換型的接口,可以把將一種類型的數據轉化為另外一種類型的數據

privatevoidtestFunction(){
//獲取每個字符串的長度,并且返回
Functionfunction=String::length;
Streamstream=Stream.of("程序員芋艿","芋道源碼","打代碼的芋艿");
StreamresultStream=stream.map(function);
resultStream.forEach(System.out::println);
}

Consumer是一個消費性接口,通過傳入參數,并且無返回的操作

privatevoidtestComsumer(){
//獲取每個字符串的長度,并且返回
Consumercomsumer=System.out::println;
Streamstream=Stream.of("程序員芋艿","芋道源碼","打代碼的芋艿");
stream.forEach(comsumer);
}

Predicate是一個判斷型接口,并且返回布爾值結果.

privatevoidtestPredicate(){
//獲取每個字符串的長度,并且返回
Predicatepredicate=a->a>18;
UserInfouserInfo=newUserInfo(2L,"程序員芋艿",27);
System.out.println(predicate.test(userInfo.getAge()));
}

Supplier是一個供給型接口,無參數,有返回結果。

privatevoidtestSupplier(){
Suppliersupplier=()->Integer.valueOf("666");
System.out.println(supplier.get());
}

這幾個函數在日常開發中,也是可以靈活應用的,比如我們DAO操作完數據庫,是會有個result的整型結果返回。我們就可以用Supplier來統一判斷是否操作成功。如下:

privatevoidsaveDb(Suppliersupplier){
if(supplier.get()>0){
System.out.println("插入數據庫成功");
}else{
System.out.println("插入數據庫失敗");
}
}

@Test
publicvoidadd()throwsException{
Coursecourse=newCourse();
course.setCname("java");
course.setUserId(100L);
course.setCstatus("Normal");
saveDb(()->courseMapper.insert(course));
}


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2960

    瀏覽量

    104565
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
  • Lambda
    +關注

    關注

    0

    文章

    28

    瀏覽量

    9859

原文標題:我用Lambda表達式寫代碼,開發速度提高了10倍!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Verilog表達式的位寬確定規則

    很多時候,Verilog中表達式的位寬都是被隱式確定的,即使你自己設計了位寬,它也是根據規則先確定位寬后,再擴展到你的設計位寬,這常常會導致結果產生意想不到的錯誤。
    的頭像 發表于 10-22 15:41 ?264次閱讀
    Verilog<b class='flag-5'>表達式</b>的位寬確定規則

    nginx中的正則表達式和location路徑匹配指南

    前言,我這里驗證的nginx-v1.23.2單機環境下的nginx中的正則表達式、location路徑匹配規則和優先級。
    的頭像 發表于 09-29 16:02 ?494次閱讀
    nginx中的正則<b class='flag-5'>表達式</b>和location路徑匹配指南

    求助,以下恒流源電路Io的計算表達式怎么計算?

    這個恒流源電路Io的計算表達式怎么計算,求給出詳細計算過程
    發表于 08-22 08:16

    TestStand表達式中常用的語法規則和運算符使用

    TestStand也有自己的語言嘛?在回答這個問題之前大家可以想一下在使用TestStand時有一個和語言密切相關的屬性。沒錯那就是表達式(Expressions),在這篇文章中,小編將以Q&A的方式來帶著大家來理解并熟悉TestStand表達式中較為常用的一些語法規則以
    的頭像 發表于 08-15 18:10 ?1137次閱讀
    TestStand<b class='flag-5'>表達式</b>中常用的語法規則和運算符使用

    鴻蒙原生應用元服務開發-倉頡基本概念表達式(二)

    三、do-while 表達式 do-while 表達式的基本形式為: do { 循環體 } while (條件) 其中“條件”是布爾類型表達式,“循環體”是一個代碼塊。do-while
    發表于 08-09 14:26

    鴻蒙原生應用元服務開發-倉頡基本概念表達式(一)

    ,如果最小公共父類型不存在,編譯會報錯。 如果編譯通過,則 if 表達式的值就是所執行分支代碼塊的值。 如果含 else 分支的 if 表達式沒有被求值,在這種場景里,開發者一般只想在
    發表于 08-08 10:27

    求助,有關表達式選項卡(ADS)的問題求解

    你好。 我看不到表達式選項卡中的某些變量值。 數組的大小顯然是 256,但我最多只能看到 100。 請問問題出在哪里? 謝謝。
    發表于 06-03 06:23

    mapgis屬性篩選表達式

    篇文章中,我們將詳細討論MapGIS的屬性篩選表達式,包括語法、操作符和函數等。 屬性篩選表達式是一種在MapGIS中用于指定要素選擇條件的代碼。它由一組操作符、函數和屬性字段組成,用于描述要篩選的要素的特征。在MapGIS中,
    的頭像 發表于 02-25 10:58 ?1501次閱讀

    西門子博途的算術表達式

    算術表達式既可以是一個數字值,也可以是由帶有算術運算符的兩個值或表達式組合而成。 算術運算符可以處理當前 CPU 所支持的各種數據類型。如果在該運算中有 2 個操作數,那么可根據以下條件來確定結果的數據類型。
    的頭像 發表于 01-24 11:36 ?950次閱讀

    你還不會gvim正則表達式?一文搞懂!

    gvim正則表達式常在命令行模式下使用,一般用于文本文件字符串的替換、刪除等操作。
    的頭像 發表于 01-19 16:47 ?1114次閱讀

    rs觸發器的邏輯表達式

    邏輯表達式是描述邏輯關系的符號表示,可以用于定義和描述各種電路和邏輯操作。在邏輯電路中,RS觸發器是一種基本的存儲器元件,也被稱為鎖存器。 RS觸發器是由兩個與門組成的,其輸出互相連接,形成一個反饋
    的頭像 發表于 01-12 14:09 ?2922次閱讀

    全加器的邏輯表達式怎么推

    全加器是計算機中常用的一種邏輯電路,用于實現二進制加法運算。全加器接受兩個輸入位和一個進位位,并輸出一個和位和一個進位位。它的邏輯表達式可以通過推導和分析得出。 首先,讓我們回顧一下二進制加法的規則
    的頭像 發表于 12-25 16:09 ?4117次閱讀

    GVIM正則表達式介紹和使用示例

    20世紀50年代,一位名叫Stephen Cole Kleene的美國數學家發表了規則的語言(regular language)的定義。規則的表達式就是用來描述規則的語言的表達式。后來發明UNIX
    的頭像 發表于 12-18 15:09 ?1190次閱讀
    GVIM正則<b class='flag-5'>表達式</b>介紹和使用示例

    一文詳解Java表達式引擎選型

    AviatorScript 是一門高性能、輕量級寄宿于 JVM 之上的腳本語言。AviatorScript 可將表達式編譯成字節碼。它原來的定位一直只是一個表達式引擎,不支持 if/else 條件
    的頭像 發表于 12-06 10:57 ?1826次閱讀
    一文詳解Java<b class='flag-5'>表達式</b>引擎選型

    如何從一個簡單的數學表達式創建一個Saber模型?

    如何從一個簡單的數學表達式創建一個Saber模型,將你的輸出描述為輸入的函數?例如 out=a*in*in+b (其中 a 和 b 是常數)。
    的頭像 發表于 12-05 13:42 ?689次閱讀
    如何從一個簡單的數學<b class='flag-5'>表達式</b>創建一個Saber模型?