亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-30 10:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


前言

日常開發(fā)中,我們很多時候需要用到Java 8Lambda表達式,它允許把函數(shù)作為一個方法的參數(shù),讓我們的代碼更優(yōu)雅、更簡潔。所以整理了一波工作中,我常用的,有哪些Lambda表達式??赐暌欢〞袔椭?。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

1. list 轉(zhuǎn) map

工作中,我們經(jīng)常遇到list轉(zhuǎn)map的案例。Collectors.toMap就可以把一個list數(shù)組轉(zhuǎn)成一個Map。代碼如下:

publicclassTestLambda{

publicstaticvoidmain(String[]args){

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

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

//運行結(jié)果
芋道源碼
程序員芋艿

類似的,還有Collectors.toList()、Collectors.toSet(),表示把對應(yīng)的流轉(zhuǎn)化為list或者Set

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

2. filter()過濾

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

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()));

//運行結(jié)果
程序員芋艿
打代碼的芋艿

3. foreach 遍歷

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

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

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

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

4. groupingBy 分組

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

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()));

//運行結(jié)果
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可以去除重復(fù)的元素:

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

7. findFirst 返回第一個

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

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 轉(zhuǎn)換

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

Listlist=Arrays.asList("jay","tianluo");
//轉(zhuǎn)化為大寫
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("關(guān)注公眾號:"+a)).collect(Collectors.toList());
System.out.println(result);
//運行結(jié)果
關(guān)注公眾號:程序員芋艿
關(guān)注公眾號:芋道源碼
[程序員芋艿,芋道源碼]

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));

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

14. count 統(tǒng)計

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

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. 常用函數(shù)式接口

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

  • Function(轉(zhuǎn)換型): 接受一個輸入?yún)?shù),返回一個結(jié)果
  • Consumer (消費型): 接收一個輸入?yún)?shù),并且無返回操作
  • Predicate (判斷型): 接收一個輸入?yún)?shù),并且返回布爾值結(jié)果
  • Supplier (供給型): 無參數(shù),返回結(jié)果

Function 是一個功能轉(zhuǎn)換型的接口,可以把將一種類型的數(shù)據(jù)轉(zhuǎn)化為另外一種類型的數(shù)據(jù)

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

Consumer是一個消費性接口,通過傳入?yún)?shù),并且無返回的操作

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

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

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

Supplier是一個供給型接口,無參數(shù),有返回結(jié)果。

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

這幾個函數(shù)在日常開發(fā)中,也是可以靈活應(yīng)用的,比如我們DAO操作完數(shù)據(jù)庫,是會有個result的整型結(jié)果返回。我們就可以用Supplier來統(tǒng)一判斷是否操作成功。如下:

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

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


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2995

    瀏覽量

    115398
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4932

    瀏覽量

    72850
  • Lambda
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    10469

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    inline ASM(內(nèi)聯(lián)匯編)的細節(jié)分享

    表示輸入表達式是一個立即數(shù)(浮點數(shù)),不需要借助任何寄存器 #### 操作表達式編號 其操作表達式被按照被列出的順序編號,第一個是0,第2個是1,依次類推,GCC最多允許有10個操作
    發(fā)表于 10-31 09:11

    I1電流計算對不對?怎么推導(dǎo)不出來I1的表達式是圖中那樣

    I1電流計算對不對?怎么推導(dǎo)不出來I1的表達式是圖中那樣
    發(fā)表于 09-28 18:01

    labview如何使用VISA串口資源查找的正則表達式提取串口的資源名稱?

    如圖,如何利用VISA資源查找的正則表達式從很多串口當中提取想要的目標串口(Quectel USB AT Port這個串口)?
    發(fā)表于 07-07 17:20

    基礎(chǔ)篇3:掌握Python中的條件語句與循環(huán)

    不同的條件執(zhí)行不同的代碼塊。Python中的條件語句主要使用if、elif(else if的縮寫)和else關(guān)鍵字。 if語句 最簡單的條件語句是if語句,它的工作方式如下: 復(fù)制代碼 if 條件表達式
    發(fā)表于 07-03 16:13

    Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場表達式\"中的值提示找不到地址,為什么?

    Cubeide1.18.1在線調(diào)試時,在\"現(xiàn)場表達式\"中添加全局變量,然后改變其數(shù)值,Console窗口提示: Failed to read all registers
    發(fā)表于 06-12 06:50

    《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)

    ; 表達式3)語句相比前面的while和do while語句,for語句的表達式有三個,表達式之間‘;’隔開,這三個表達式的作用和執(zhí)行時期
    發(fā)表于 06-10 09:20

    Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場表達式\"中的值提示找不到地址是怎么回事?

    Cubeide1.18.1在線調(diào)試時,在\"現(xiàn)場表達式\"中添加全局變量,然后改變其數(shù)值,Console窗口提示: Failed to read all registers
    發(fā)表于 06-10 08:26

    干貨分享 | 零基礎(chǔ)上手!TSMaster圖形信號表達式實操指南

    TSMaster軟件支持在圖形里面的信號表達式功能,主要用于多信號表達式運算和顯示的場景。本文將以A2L中的標定變量為例,介紹如何使用圖形中的信號表達式功能進行多信號的后處理運算和顯示。本文關(guān)鍵詞
    的頭像 發(fā)表于 06-06 20:03 ?558次閱讀
    干貨分享 | 零基礎(chǔ)上手!TSMaster圖形信號<b class='flag-5'>表達式</b>實操指南

    Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場表達式\"中的值提示找不到地址,怎么解決?

    Cubeide1.18.1在線調(diào)試時,在\"現(xiàn)場表達式\"中添加全局變量,然后改變其數(shù)值,Console窗口提示: Failed to read all registers
    發(fā)表于 06-06 08:27

    Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場表達式\"中的值提示找不到地址怎么解決?

    Cubeide1.18.1在線調(diào)試時,在\"現(xiàn)場表達式\"中添加全局變量,然后改變其數(shù)值,Console窗口提示: Failed to read all registers
    發(fā)表于 04-27 06:18

    HarmonyOS NEXT 原生應(yīng)用/元服務(wù)-ArkTS代碼調(diào)試Evaluate and log

    開發(fā)者可以通過 Evaluate and log 能力在代碼執(zhí)行到斷點行時打印開發(fā)者指定的表達式。 操作步驟 在需要打印表達式結(jié)果的地方設(shè)置
    發(fā)表于 03-14 16:49

    利用棧結(jié)構(gòu)實現(xiàn)四則運算的巧妙方法

    上個視頻寫了個簡易計算器,算個簡單的加減乘除還行,但是如果來個混合運算,或者加個括號,這幾行代碼就差的太多了。 處理這種混合運算,不得不提到數(shù)據(jù)結(jié)構(gòu)中的棧。 我們平時的這種表達式,叫做中綴
    的頭像 發(fā)表于 02-07 11:06 ?912次閱讀

    云端AI開發(fā)者工具怎么

    云端AI開發(fā)者工具通常包括代碼編輯器、模型訓(xùn)練平臺、自動化測試工具、代碼管理工具等。這些工具不僅降低了AI開發(fā)的門檻,還極大地提高了
    的頭像 發(fā)表于 12-05 13:31 ?848次閱讀

    表達式畫Coms電路,最近二周有比賽第一次接觸Cmos,主要用與或非門電路畫

    與或非門電路繪畫,通過表達式,來繪畫cmos門電路
    發(fā)表于 12-04 16:02

    詳解nginx中的正則表達式

    前言,我這里驗證的nginx-v1.23.2單機環(huán)境下的nginx中的正則表達式、location路徑匹配規(guī)則和優(yōu)先級。
    的頭像 發(fā)表于 12-03 09:59 ?1191次閱讀
    詳解nginx中的正則<b class='flag-5'>表達式</b>