1. 程式人生 > >java8:Lambda表示式入門

java8:Lambda表示式入門

什麼是Lambda表示式?

Lambda 是一個匿名函式,我們可以把 Lambda 表示式理解為是一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞)。可以寫出更簡潔、更靈活的程式碼。作為一種更緊湊的程式碼風格,使 Java的語言表達能力得到了提升。

匿名內部類的寫法

Comparator<Integer> comparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return Integer.compare(o1, o2);
    }
};
Runnable runnable = new
Runnable() { @Override public void run() {} };

這樣寫會發現一個問題,實現的方法是冗餘的程式碼,實際當中並沒有什麼用處。我們看看Lamda的寫法。

Lambda表示式的寫法

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
Runnable runnable = () -> System.out.println("Lambda表示式");

我們會發現Lambda表示式的寫法更加的簡潔、靈活。它只關心引數和執行的功能(具體需要幹什麼,比如->後的Integer.compare(x, y))。

Lambda 表示式語法

Lambda 表示式在Java 語言中引入了一個新的語法元 素和操作符。這個操作符為 “->” , 該操作符被稱為 Lambda 操作符或剪頭操作符。它將 Lambda 分為 兩個部分:
左側:指定了 Lambda 表示式需要的所有引數
右側:指定了 Lambda 體,即 Lambda 表示式要執行的功能。

語法格式一:無參,無返回值,Lambda 體只需一條語句

Runnable runnable = () -> System.out.println("lamda表示式");

語法格式二:Lambda 只需要一個引數

Consumer<String> consumer
=(x)->
System.out.println(x);

語法格式三:Lambda 只需要一個引數時,引數的小括號可以省略

Consumer<String> consumer=x->System.out.println(x);

語法格式四:Lambda 需要兩個引數

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);

語法格式五:當 Lambda 體只有一條語句時,return 與大括號可以省略

BinaryOperator<Integer> binaryOperator=(x,y)->(x+y);

語法格式六:資料型別可以省略,因為可由編譯器推斷得出,稱為“型別推斷”

BinaryOperator<Integer> bo=(x,y)->{
System.out.println("Lambda");
return x+y;};

型別推斷

上述 Lambda 表示式中的引數型別都是由編譯器推斷得出的。Lambda 表示式中無需指定型別,程式依然可以編譯,這是因為 javac 根據程式的上下文,在後臺 推斷出了引數的型別。Lambda 表示式的型別依賴於上 下文環境,是由編譯器推斷出來的。這就是所謂的 “型別推斷”。