Lambda 详解
Lambda 表達式支持將代碼塊作為方法參數
允許使用更簡潔的創建只有一個抽象方法的接口(函數式接口)的實例
來源
lambda 也叫 匿名函數
是從 函數式編程 語言借鑒而來,用于編寫清晰,高效的代碼
有點像匿名內部類的升級版
相比起來更為簡潔。
兩者區別在于匿名內部類會創建 class 文件,lambda 只能用于單個抽象方法的接口
java8 的 lambda 引入了兩個核心思想
- 方法引用
- 行為參數化 把一個方法作為參數傳遞給另一個方法
入門demon
定義一個處理數組的類,
/*** 處理數組的類* 這個處理的行為是不確定的*/ public class ProcessArray {/*** 只有在調用 process 方法時才知道處理數組的行為*/public void process(int[] target, Command command){command.process(target);}}由于這個行為不固定 我們需要一個 command 接口
/*** 命令接口*/ public interface Command {void process(int[] target);}我們使用 ProcessArray 這個類需要傳入 command 實例, 正常而言會采用匿名內部類的方式
/*** 正常采用匿名內部類的方式調用*/ @Test public void t1(){int[] a = {1,2,3,4};ProcessArray processArray = new ProcessArray();//調用 process 方法才知道要求和processArray.process(a, new Command() {@Overridepublic void process(int[] target) {int sum = 0;for (int i : a) {sum += i;}log.info("數組和為{}", sum);}}); }lambda 出來后,可以簡化一點
/*** 通過 lambda 表達式優化代碼*/ @Test public void t2(){int[] a = {1,2,3,4};ProcessArray processArray = new ProcessArray();processArray.process(a, target -> {int sum = 0;for (int i : target) {sum += i;}log.info("數組和為{}", sum);}); }以上是 lambda 最簡單的應用方式
使用方式
lambda 表達式允許把函數作為一個方法的參數進行傳遞
- **可選類型聲明:**不需要聲明參數類型,編譯器可以統一識別參數值。
- **可選的參數圓括號:**一個參數無需定義圓括號,但多個參數需要定義圓括號。
- **可選的大括號:**如果主體包含了一個語句,就不需要使用大括號。
- **可選的返回關鍵字:**如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定表達式返回了一個數值。
構造器引用
格式為 ClassName :: new
用處不大 用于調用構造器創建對象
構造器的參數列表 由接口的參數決定
比如 Supplier 接口調用無參構造器 Function 方法可以調用一個參數的構造器
方法引用
是一種語法糖
當 lambda 體中的內容已經有方法實現了,我們可以用方法引用去簡化代碼
一共有三種語法格式
- 對象 :: 實例方法名
- 類 :: 靜態方法名
- 類 :: 實例方法名
對象 :: 實例方法名
/*** 對象 :: 實例方法名*/@Testpublic void t1(){//lambda 寫法Consumer<String> con1 = s -> System.out.println(s);//方法引用Consumer<String> con2 = System.out::println;}類 :: 靜態方法名
@Testpublic void t2(){//lambda 寫法Comparator<Integer> comparator1 = (x, y)->Integer.compare(x, y);System.out.println(comparator1.compare(1, 2));//方法引用 ** 需要注意被調用方法的參數列表和返回值類型需要和函數式接口中保持一致 **Comparator<Integer> comparator2 = Integer::compare;}類 :: 實例方法名
@Testpublic void t3(){//lambda 寫法BiPredicate<String, String> biPredicate1 = (x, y) -> x.equals(y);//方法引用 ** 第一個參數是這個實例方法的調用者 第二個參數是這個方法的參數時 可以使用這種語法 **BiPredicate<String, String> biPredicate2 = String::equals;}總結
- 上一篇: 如何分辨及举报钓鱼网站/诈骗网站
- 下一篇: 卓朗数字孪生的重要意义