日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 8 - Lambda从兴趣盎然到索然无味

發(fā)布時(shí)間:2025/3/21 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 - Lambda从兴趣盎然到索然无味 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • Pre
  • 常見(jiàn)的內(nèi)置函數(shù)式接口
    • 函數(shù)型接口
    • 消費(fèi)型接口
    • 供給型接口
    • 斷言型接口
  • 基本用法
    • 無(wú)參
    • 1個(gè)參數(shù)
    • 多個(gè)參數(shù)
  • 方法引用
    • 引用靜態(tài)方法
    • 引用對(duì)象的方法
    • 引用類的方法
    • 引用構(gòu)造方法

Pre

Lambda表達(dá)式是以函數(shù)式接口作為基礎(chǔ),所以非常有必要了解一下函數(shù)式接口

Java 8 - 01 優(yōu)雅編程 lambda 以及 @FunctionalInterface注解一點(diǎn)通

Java 8 - 02 Lambda Expression

Java 8 - 03 Lambda 函數(shù)式接口Predicate & Consumer & Function & Supplier

Java 8 - 04 類型檢查、類型推斷以及限制

Java 8 - 05 方法引用

Java 8 - 06 Lambda 和方法引用實(shí)戰(zhàn)

Java 8 - 07 復(fù)合 Lambda 表達(dá)式


常見(jiàn)的內(nèi)置函數(shù)式接口

這里我們簡(jiǎn)單點(diǎn)得再來(lái)梳理一下

函數(shù)型接口

Function<T,R>

抽象方法: R apply(T t),傳入一個(gè)參數(shù),返回想要的結(jié)果。


消費(fèi)型接口

Consumer<T>

抽象方法: void accept(T t),接收一個(gè)參數(shù)進(jìn)行消費(fèi),但無(wú)需返回結(jié)果。


供給型接口

Supplier<T>

抽象方法:T get(),無(wú)參數(shù),有返回值。


斷言型接口

Predicate<T>

抽象方法: boolean test(T t),傳入一個(gè)參數(shù),返回一個(gè)布爾值。


基本用法

Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡(jiǎn)潔緊湊。

語(yǔ)法如下

(parameters) -> expression

(parameters) ->{ statements; }
  • 可選類型聲明:不需要聲明參數(shù)類型,編譯器可以統(tǒng)一識(shí)別參數(shù)值。
  • 可選的參數(shù)圓括號(hào):一個(gè)參數(shù)無(wú)需定義圓括號(hào),但多個(gè)參數(shù)需要定義圓括號(hào)。
  • 可選的大括號(hào):如果主體包含了一個(gè)語(yǔ)句,就不需要使用大括號(hào)。
  • 可選的返回關(guān)鍵字:如果主體只有一個(gè)表達(dá)式返回值則編譯器會(huì)自動(dòng)返回值,大括號(hào)需要指定明表達(dá)式返回了一個(gè)數(shù)值。

無(wú)參

/*** 無(wú)參的形式*/new Thread(new Runnable() {@Overridepublic void run() {System.out.println("artisan learn lambda");}}).start();/*** () -> {* 執(zhí)行語(yǔ)句;* }** 如果 執(zhí)行的內(nèi)容僅有一句,{} 也是可以省略的。 執(zhí)行語(yǔ)句后無(wú)標(biāo)點(diǎn)符號(hào) ** () ->**/new Thread(()->System.out.println("artisan learn lambda")).start();

1個(gè)參數(shù)

([類名] 變量名) -> {執(zhí)行語(yǔ)句; }

類名可選, lambda會(huì)通過(guò)類型推導(dǎo)自動(dòng)推到出類型 。

當(dāng)只有一條語(yǔ)句時(shí),依然可以對(duì)代碼塊進(jìn)行簡(jiǎn)寫(xiě)

([類名 ]變量名) -> 表達(dá)式

或者

變量名 -> 表達(dá)式

多個(gè)參數(shù)

多參函數(shù)是指具有兩個(gè)及以上參數(shù)的函數(shù)

([類名1 ]變量名1, [類名2 ]變量名2[, ...]) -> {執(zhí)行語(yǔ)句}

舉個(gè)例子

List<Integer> list = Arrays.asList(1, 2, 3);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});

上面是原始的寫(xiě)法哈,大家都很熟悉

怎么使用lambda簡(jiǎn)寫(xiě)呢?

Collections.sort(list, (o1,o2) -> {return o1.compareTo(o2);});

還能更簡(jiǎn)潔

當(dāng)只有一條語(yǔ)句時(shí),還可以對(duì)代碼塊進(jìn)行簡(jiǎn)寫(xiě),格式如下:

([類名1 ]變量名1, [類名2 ]變量名2[, ...]) -> 表達(dá)式 Collections.sort(list, (o1,o2) -> o1.compareTo(o2));

此時(shí)類名也是可以省略的,但括號(hào)不能省略。如果這條語(yǔ)句需要返回值,那么 return 關(guān)鍵字是不需要寫(xiě)的。


其實(shí)還能更精簡(jiǎn),如下形式

Collections.sort(list, Integer::compareTo);

咦 ,這是什么? ------------> 方法引用


方法引用

是一種簡(jiǎn)化開(kāi)發(fā)的語(yǔ)法糖。

在使用 Lambda 表達(dá)式的時(shí)候,如果“->”的右邊要執(zhí)行的表達(dá)式只是調(diào)用一個(gè)類已有的方法,那么就可以用「方法引用」來(lái)替代 Lambda 表達(dá)式。

方法引用可以分為 4 類:

  • 引用靜態(tài)方法

  • 引用對(duì)象的方法

  • 引用類的方法

  • 引用構(gòu)造方法


引用靜態(tài)方法

當(dāng)要執(zhí)行的表達(dá)式是調(diào)用某個(gè)類的靜態(tài)方法,并且這個(gè)靜態(tài)方法的參數(shù)列表和接口里抽象函數(shù)的參數(shù)列表一一對(duì)應(yīng)時(shí),可以采用引用靜態(tài)方法的格式。

假如 Lambda 表達(dá)式符合如下格式:

([變量1, 變量2, ...]) -> 類名.靜態(tài)方法名([變量1, 變量2, ...])

可以簡(jiǎn)寫(xiě)成如下格式:

類名::靜態(tài)方法名

注意:靜態(tài)方法名后面不需要加括號(hào),也不用加參數(shù),通過(guò)類型推斷可以推導(dǎo)出來(lái)。

來(lái)個(gè)demo

import java.util.Arrays; import java.util.Collections;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/3/7 11:19* @mark: show me the code , change the world*/ public class CompareUtil {public static int compare(Integer o1,Integer o2){return o1.compareTo(o2);}public static void main(String[] args) {// lambda Collections.sort(Arrays.asList(1,2,3), (o1,o2)->CompareUtil.compare(o1,o2)).;// 采用方法引用 Collections.sort(Arrays.asList(1,2,3),CompareUtil::compare);} }

注意這里自定義的compare 函數(shù)的參數(shù)和 Comparable 接口的 compare 函數(shù)的參數(shù)是一一對(duì)應(yīng)的。

所以一般的 Lambda 表達(dá)式可以這樣寫(xiě)

// lambda Collections.sort(Arrays.asList(1,2,3), (o1,o2)->CompareUtil.compare(o1,o2)).;

如果采用方法引用的方式,可以簡(jiǎn)寫(xiě)成這樣
阿薩德2·

Collections.sort(Arrays.asList(1,2,3),CompareUtil::compare);

引用對(duì)象的方法

當(dāng)要執(zhí)行的表達(dá)式是調(diào)用某個(gè)對(duì)象的方法,并且這個(gè)方法的參數(shù)列表和接口里抽象函數(shù)的參數(shù)列表一一對(duì)應(yīng)時(shí),就可以采用引用對(duì)象的方法的格式。

假如 Lambda 表達(dá)式符合如下格式:

([變量1, 變量2, ...]) -> 對(duì)象引用.方法名([變量1, 變量2, ...])

可以簡(jiǎn)寫(xiě)成如下格式:

對(duì)象引用::方法名

來(lái)個(gè)demo

public class CompareUtil {public int compareNoramMethod(Integer o1,Integer o2){return o1.compareTo(o2);}public static void main(String[] args) {// 實(shí)例化對(duì)象CompareUtil compare = new CompareUtil();// 傳統(tǒng)的lambdaCollections.sort(Arrays.asList(1,2,3),(o1,o2)->compare.compareNoramMethod(o1,o2));// 方法引用Collections.sort(Arrays.asList(1,2,3),compare::compareNoramMethod);} }

當(dāng)創(chuàng)建一個(gè)該類的對(duì)象,并在 Lambda 表達(dá)式中使用該對(duì)象的方法時(shí),通常可以這么寫(xiě):

// 實(shí)例化對(duì)象CompareUtil compare = new CompareUtil();// 傳統(tǒng)的lambdaCollections.sort(Arrays.asList(1,2,3),(o1,o2)->compare.compareNoramMethod(o1,o2));

注意這里函數(shù)的參數(shù)也是一一對(duì)應(yīng)的,那么采用方法引用的方式,可以這樣簡(jiǎn)寫(xiě):

// 實(shí)例化對(duì)象CompareUtil compare = new CompareUtil();// 方法引用Collections.sort(Arrays.asList(1,2,3),compare::compareNoramMethod);

當(dāng)要執(zhí)行的表達(dá)式是調(diào)用 Lambda 表達(dá)式所在的類的方法時(shí),還可以采用如下格式:

this::方法名


引用類的方法

引用類的方法所采用的參數(shù)對(duì)應(yīng)形式與上兩種有點(diǎn)區(qū)別

如果 Lambda 表達(dá)式的“->”的右邊要執(zhí)行的表達(dá)式是調(diào)用的“->”的左邊第一個(gè)參數(shù)的某個(gè)實(shí)例方法,并且從第二個(gè)參數(shù)開(kāi)始(或無(wú)參)對(duì)應(yīng)到該實(shí)例方法的參數(shù)列表時(shí),就可以使用這種方法。

(變量1[, 變量2, ...]) -> 變量1.實(shí)例方法([變量2, ...])

可以簡(jiǎn)化為

變量1對(duì)應(yīng)的類名::實(shí)例方法名

來(lái)個(gè)demo

Collections.sort(Arrays.asList(1,2,3), (o1, o2) -> o1.compareTo(o2));Collections.sort(Arrays.asList(1,2,3),Integer::compareTo);

引用構(gòu)造方法

當(dāng)要執(zhí)行的表達(dá)式是新建一個(gè)對(duì)象,并且這個(gè)對(duì)象的構(gòu)造方法的參數(shù)列表和接口里函數(shù)的參數(shù)列表一一對(duì)應(yīng)時(shí),就可以采用「引用構(gòu)造方法」的格式。

假如我們的 Lambda 表達(dá)式符合如下格式:

([變量1, 變量2, ...]) -> new 類名([變量1, 變量2, ...])

就可以簡(jiǎn)寫(xiě)成如下格式:

類名::new

總結(jié)

以上是生活随笔為你收集整理的Java 8 - Lambda从兴趣盎然到索然无味的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。