Java 8 - Lambda从兴趣盎然到索然无味
文章目錄
- Pre
- 常見的內置函數式接口
- 函數型接口
- 消費型接口
- 供給型接口
- 斷言型接口
- 基本用法
- 無參
- 1個參數
- 多個參數
- 方法引用
- 引用靜態方法
- 引用對象的方法
- 引用類的方法
- 引用構造方法
Pre
Lambda表達式是以函數式接口作為基礎,所以非常有必要了解一下函數式接口
Java 8 - 01 優雅編程 lambda 以及 @FunctionalInterface注解一點通
Java 8 - 02 Lambda Expression
Java 8 - 03 Lambda 函數式接口Predicate & Consumer & Function & Supplier
Java 8 - 04 類型檢查、類型推斷以及限制
Java 8 - 05 方法引用
Java 8 - 06 Lambda 和方法引用實戰
Java 8 - 07 復合 Lambda 表達式
常見的內置函數式接口
這里我們簡單點得再來梳理一下
函數型接口
Function<T,R>抽象方法: R apply(T t),傳入一個參數,返回想要的結果。
消費型接口
Consumer<T>抽象方法: void accept(T t),接收一個參數進行消費,但無需返回結果。
供給型接口
Supplier<T>抽象方法:T get(),無參數,有返回值。
斷言型接口
Predicate<T>抽象方法: boolean test(T t),傳入一個參數,返回一個布爾值。
基本用法
Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
語法如下
(parameters) -> expression或
(parameters) ->{ statements; }- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
無參
/*** 無參的形式*/new Thread(new Runnable() {@Overridepublic void run() {System.out.println("artisan learn lambda");}}).start();/*** () -> {* 執行語句;* }** 如果 執行的內容僅有一句,{} 也是可以省略的。 執行語句后無標點符號 ** () ->**/new Thread(()->System.out.println("artisan learn lambda")).start();1個參數
([類名] 變量名) -> {執行語句; }類名可選, lambda會通過類型推導自動推到出類型 。
當只有一條語句時,依然可以對代碼塊進行簡寫
([類名 ]變量名) -> 表達式或者
變量名 -> 表達式多個參數
多參函數是指具有兩個及以上參數的函數
([類名1 ]變量名1, [類名2 ]變量名2[, ...]) -> {執行語句}舉個例子
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);}});上面是原始的寫法哈,大家都很熟悉
怎么使用lambda簡寫呢?
Collections.sort(list, (o1,o2) -> {return o1.compareTo(o2);});還能更簡潔
當只有一條語句時,還可以對代碼塊進行簡寫,格式如下:
([類名1 ]變量名1, [類名2 ]變量名2[, ...]) -> 表達式 Collections.sort(list, (o1,o2) -> o1.compareTo(o2));此時類名也是可以省略的,但括號不能省略。如果這條語句需要返回值,那么 return 關鍵字是不需要寫的。
其實還能更精簡,如下形式
Collections.sort(list, Integer::compareTo);咦 ,這是什么? ------------> 方法引用
方法引用
是一種簡化開發的語法糖。
在使用 Lambda 表達式的時候,如果“->”的右邊要執行的表達式只是調用一個類已有的方法,那么就可以用「方法引用」來替代 Lambda 表達式。
方法引用可以分為 4 類:
-
引用靜態方法
-
引用對象的方法
-
引用類的方法
-
引用構造方法
引用靜態方法
當要執行的表達式是調用某個類的靜態方法,并且這個靜態方法的參數列表和接口里抽象函數的參數列表一一對應時,可以采用引用靜態方法的格式。
假如 Lambda 表達式符合如下格式:
([變量1, 變量2, ...]) -> 類名.靜態方法名([變量1, 變量2, ...])可以簡寫成如下格式:
類名::靜態方法名注意:靜態方法名后面不需要加括號,也不用加參數,通過類型推斷可以推導出來。
來個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 函數的參數和 Comparable 接口的 compare 函數的參數是一一對應的。
所以一般的 Lambda 表達式可以這樣寫
// lambda Collections.sort(Arrays.asList(1,2,3), (o1,o2)->CompareUtil.compare(o1,o2)).;如果采用方法引用的方式,可以簡寫成這樣
阿薩德2·
引用對象的方法
當要執行的表達式是調用某個對象的方法,并且這個方法的參數列表和接口里抽象函數的參數列表一一對應時,就可以采用引用對象的方法的格式。
假如 Lambda 表達式符合如下格式:
([變量1, 變量2, ...]) -> 對象引用.方法名([變量1, 變量2, ...])可以簡寫成如下格式:
對象引用::方法名來個demo
public class CompareUtil {public int compareNoramMethod(Integer o1,Integer o2){return o1.compareTo(o2);}public static void main(String[] args) {// 實例化對象CompareUtil compare = new CompareUtil();// 傳統的lambdaCollections.sort(Arrays.asList(1,2,3),(o1,o2)->compare.compareNoramMethod(o1,o2));// 方法引用Collections.sort(Arrays.asList(1,2,3),compare::compareNoramMethod);} }當創建一個該類的對象,并在 Lambda 表達式中使用該對象的方法時,通??梢赃@么寫:
// 實例化對象CompareUtil compare = new CompareUtil();// 傳統的lambdaCollections.sort(Arrays.asList(1,2,3),(o1,o2)->compare.compareNoramMethod(o1,o2));注意這里函數的參數也是一一對應的,那么采用方法引用的方式,可以這樣簡寫:
// 實例化對象CompareUtil compare = new CompareUtil();// 方法引用Collections.sort(Arrays.asList(1,2,3),compare::compareNoramMethod);當要執行的表達式是調用 Lambda 表達式所在的類的方法時,還可以采用如下格式:
this::方法名引用類的方法
引用類的方法所采用的參數對應形式與上兩種有點區別
如果 Lambda 表達式的“->”的右邊要執行的表達式是調用的“->”的左邊第一個參數的某個實例方法,并且從第二個參數開始(或無參)對應到該實例方法的參數列表時,就可以使用這種方法。
(變量1[, 變量2, ...]) -> 變量1.實例方法([變量2, ...])可以簡化為
變量1對應的類名::實例方法名來個demo
Collections.sort(Arrays.asList(1,2,3), (o1, o2) -> o1.compareTo(o2));Collections.sort(Arrays.asList(1,2,3),Integer::compareTo);引用構造方法
當要執行的表達式是新建一個對象,并且這個對象的構造方法的參數列表和接口里函數的參數列表一一對應時,就可以采用「引用構造方法」的格式。
假如我們的 Lambda 表達式符合如下格式:
([變量1, 變量2, ...]) -> new 類名([變量1, 變量2, ...])就可以簡寫成如下格式:
類名::new總結
以上是生活随笔為你收集整理的Java 8 - Lambda从兴趣盎然到索然无味的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8 - 时间API
- 下一篇: Java 8 - Stream流骚操作