Java JDK8—Lambda表達式/方法引用/函數式接口/默認方法/CompletableFuture


一、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

    https://www.jianshu.com/p/6bac52527ca4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM