天天看點

Java8 之 Lambda表達式

Java8 之 Lambda表達式

    • 1.函數式接口
      • 1.1 常用的函數式接口
      • 1.2 自定義函數式接口
    • 2.Lambda表達式
      • 2.1 案例
    • 3.類型推斷

Java8 中的 Lambda表達式 需要“函數式”接口的支援;

1.函數式接口

函數式接口 :隻有一個抽象方法的接口;

1.1 常用的函數式接口

  • 消費型接口:

Consumer

void accept(T t);
           
  • 供給型接口:

Supplier

T get();
           
  • 函數型接口:

Function<T, R>

R apply(T t);
           
  • 斷言型接口:

Predicate

boolean test(T t);
           

其他函數式接口可在 java.util.function 包中擷取學習;

1.2 自定義函數式接口

@FunctionalInterface
public interface XXX<T , ...> {

    XXX xxx(T t , ...);
}
           

注意:

  • 使用 @FunctionalInterface 辨別類,表示這是一個函數式接口,内部隻能存在一個抽象方法;

2.Lambda表達式

結構 : (…) -> {…}

-> Lambda操作符 (或稱為 剪刀操作符 )

左邊 入參

右邊 Lambda 體,即 Lambda 表達式要執行的功能

2.1 案例

Consumer consumer = (t) -> System.out.println(t);

Supplier supplier = () -> “hello”;

Function<String, String> function = (t) -> t + “world”;

Predicate predicate = (t) -> t >= 60;

3.類型推斷

Lambda 表達式中無需指定類型,程式依然可以編譯,這是因為 javac 根據程式的上下文,在背景推斷出了參數的類型。 Lambda 表達式的類型依賴于上下文環境,是由編譯器推斷出來的。這就是所謂的“類型推斷”。

注意:

  • Lambda表達式 與 函數式接口 中的方法,入參和出參都是一一對應的;
  • 左邊隻有一個入參時,() 可以不寫;
  • 右邊代碼塊隻有一句時,{} 可以不寫;
  • 入參的類型是由JVM自動推斷得到的;