Lambdas

一個函數式接口很是有價值的屬性就是他們可以用lambdas來實例化。這裏有一些lambdas的例子:html

左邊是指定類型的逗號分割的輸入列表,右邊是帶有return的代碼塊:java

1 (int x, int y) -> { return x + y; }

左邊是推導類型的逗號分割的輸入列表,右邊是返回值:函數

1 (x, y) -> x + y

左邊是推導類型的單一參數,右邊是一個返回值:spa

1 x -> x * x

左邊沒有輸入 (官方名稱: "burger arrow"),在右邊返回一個值:.net

1 () -> x

左邊是推導類型的單一參數,右邊是沒返回值的代碼塊(返回void):翻譯

1 x -> { System.out.println(x); }

靜態方法引用:code

1 String::valueOf

非靜態方法引用:htm

1 Object::toString

繼承的函數引用:繼承

1 x::toString

構造函數引用:接口

1 ArrayList::new

你能夠想出一些函數引用格式做爲其餘lambda格式的簡寫。

excepiton            
excepiton
翻譯於 1年前

2人頂

 翻譯的不錯哦!            

       

方法引用  等價的lambda表達式
String::valueOf
x -> String.valueOf(x)
Object::toString
x -> x.toString()
x::toString
() -> x.toString()
ArrayList::new
() -> new ArrayList<>()

固然,在Java裏方法能被重載。類能夠有多個同名但不一樣參數的方法。這一樣對構造方法有效。ArrayList::new可以指向它的3個構造方法中任何一個。決定使用哪一個方法是根據在使用的函數式接口。

一個lambda和給定的函數式接口在「外型」匹配的時候兼容。經過「外型」,我指向輸入、輸出的類型和聲明檢查異常。

給出兩個具體有效的例子:

1 Comparator<String> c = (a, b) -> Integer.compare(a.length(),
2                                                  b.length());

一個Comparator<String>的compare方法須要輸入兩個闡述,而後返回一個int。這和lambda右側的一致,所以這個任務是有效的。

1 Runnable r = () -> { System.out.println("Running!"); }

一個Runnable的run方法不須要參數也不會返回值。這和lambda右側一致,因此任務有效。

在抽象方法的簽名裏的受檢查異常(若是存在)也很重要。若是函數式接口在它的簽名裏聲明瞭異常,lambda只能拋出受檢查異常。

相關文章
相關標籤/搜索