一、Lambda表達式
1. 特點:Lambda表達式也可稱作閉包,它允許把一個函數作為一個方法的參數;
2. 語法:(parameters) -> expression 或 (parameters) -> {statements;}
A. 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值;
B. 可選的參數圓括號:多個參數需要定義圓括號,一個參數可以省略;
C. 可選的大括號:主體是一個語句就不需要大括號,多個語句需要定義;
D. 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,有大括號就需要指定返回值
3. 變量作用域
A. lambda表達式只能引用標記了final的外層局部變量,即不能在lambda內部修改定義在域外的局部變量,否則報編譯錯誤;
B. lambda表達式中不允許聲明一個與局部變量同名的參數或局部變量;
C. lambda表達式的局部變量可以不用聲明為final,但是必須不可被后面的代碼修改。
二、方法引用
1. 特點:方法引用通過方法的名字來指定一個方法,方法引用使用一對冒號(::)
2. 構造器引用:Class::new
3. 靜態方法引用:Class::static_method
4. 特定類的任意方法的引用:Class::method
5. 特定對象的方法引用:Instance::method
三、函數式接口
1. 特點:函數式接口就是一個具有一個方法的普通接口,可以被隱式轉換為lambda表達式,四大函數式接口都是java.util.function包下的;
2. Function 函數式接口,有一個輸入,有一個輸出;
Function<String, Integer> function = new Function<String, Integer>() { @Override public Integer apply(String o) { System.out.println("鏈式編程,流式計算,lambda表達式!” + o); return 1; } }
等價於 lambda表達式中參數只有一個時,括號可以省略
Function<String, Integer> function = o -> {
System.out.println("鏈式編程,流式計算,lambda表達式" + o);
return 1;
}
3. Predicate 斷定型接口,有一個輸入參數,返回布爾值;
Predicate<String> predicate = new Predicate<String>() { @Override public boolean test(String s) { System.out.println("鏈式編程,流式計算,lambda表達式!” + s); return true; } } 等價於 Predicate<String> predicate = s -> { System.out.println("鏈式編程,流式計算,lambda表達式" + s); return true; }
4. Consumer 消費型接口,有一個輸入參數,沒有返回值;
Consumer<String> consumer= new Consumer<String>() { @Override public void accept(String o) { System.out.println("鏈式編程,流式計算,lambda表達式!” + o); } } 等價於 Consumer<String> consumer= o -> { System.out.println("鏈式編程,流式計算,lambda表達式" + o); }
5. Supplier 供給型接口,沒有輸入參數,只有返回值。
Supplier<Integer> supplier= new Supplier<Integer>() { @Override public Integer get() { System.out.println("鏈式編程,流式計算,lambda表達式!”);
return 1; } } 等價於 Supplier<Integer> supplier = () -> { System.out.println("鏈式編程,流式計算,lambda表達式");
return 1; }
四、默認方法
1. 特點:默認方法就是借口可以有實現方法,而不需要實現類去實現方法,只需要在方法前加個default關鍵字。
五、CompletableFuture
1. Future缺點
A. 沒有提供通知機制,任務何時結束無法准確得知;
B. get()方法是阻塞等待異步結果,這無異於同步操作;
C. isDone()方法是輪詢判斷異步結果,這很消耗CPU資源。
2. 創建CompletableFuture對象
方法 | 說明 |
CompletableFuture<Void> runAsync(Runnable runnable) | 使用ForkJoinPool.commonPool()作為它的線程池執行異步代碼,無返回值 |
CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) | 使用指定的thread pool執行異步代碼,無返回值 |
CompletableFuture<U> supplyAsync(Supplier<U> supplier) | 使用ForkJoinPool.commonPool()作為它的線程池執行異步代碼,有返回值 |
CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) | 使用指定的thread pool執行異步代碼,有返回值 |
3. 主動計算,獲取結果
方法 | 說明 |
T join | 從CompletableFuture取值,調用時會阻塞線程,運行時會拋出異常,推薦join() |
V get() throws InterruptedException, ExecutionException | 從CompletableFuture取值,調用時會阻塞線程 |
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException | 與get()不同的時有超時限制 |
T getNow(T valueIfAbsent) | 若結果已經計算完則返回結果,否則返回給定的valueIfAbsent值 |
4. 超過兩個以上的任務
方法 | 說明 |
CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) | 會執行cfs中所有的任務 |
CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs) | 返回cfs中第一個執行完成的任務,其他任務都會被終結 |
可參考:https://blog.csdn.net/u012129558/article/details/78962759