Java 8 - Lambda从兴趣盎然到索然无味
文章目錄
- 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·
引用對(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)題。
- 上一篇: Java 8 - 时间API
- 下一篇: Java 8 - Stream流骚操作