一個函數式接口很是有價值的屬性就是他們可以用lambdas來實例化。這裏有一些lambdas的例子:html 左邊是指定類型的逗號分割的輸入列表,右邊是帶有return的代碼塊:java
左邊是推導類型的逗號分割的輸入列表,右邊是返回值:函數
左邊是推導類型的單一參數,右邊是一個返回值:spa
左邊沒有輸入 (官方名稱: "burger arrow"),在右邊返回一個值:.net
左邊是推導類型的單一參數,右邊是沒返回值的代碼塊(返回void):翻譯
靜態方法引用:code
非靜態方法引用:htm
繼承的函數引用:繼承
構造函數引用:接口
你能夠想出一些函數引用格式做爲其餘lambda格式的簡寫。 |
excepiton |
方法引用 | 等價的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只能拋出受檢查異常。