基礎 | Java8新特性之Lambda表示式
阿新 • • 發佈:2018-11-07
Lambda表示式是Java8所引入的新特性之一,其基於函式式介面,以極大地減少程式碼冗餘,並提高程式碼的可讀性。
Lambda表示式的基本語法
參考答案:
Java8中引入箭頭操作符(也叫Lambda操作符)將Lambda表示式拆分成左右兩部分:
- 左側:指定Lambda表示式的引數列表;
- 右側:指定Lambda表示式所要執行的功能,即Lambda體。
// 1).無引數,無返回值
Runnable r1 = () -> System.out.println("Hello Lambda!");
// 2).有一個引數,無返回值(只有一個引數時,小括號可以省略)
Consumer<String> con = (x) -> System.out.println(x);
con.accept("Hello Lambda!);
// 3).有兩個及以上引數,有返回值,且Lambda體中有多條語句
Comparator<Integer> com = (x, y) -> {
System.out.println("函式式介面");
return Integer.compare(x, y);
};
// 若lambda體中僅有一條語句,大括號和return都可以省略
什麼是函式式介面?
參考答案:
Lambda表示式需要函式式介面的支援。
僅包含一個抽象方法的介面,稱為「函式式介面」。可以在介面上使用@FunctionalInterface註解來檢查該介面是否為函式式介面。
注意:函式式介面是Lambda表示式可以使用的關鍵所在,若一個介面中包含多個抽象方法,是沒有辦法僅通過表示式左側的引數列表來定位到對應的方法。
為什麼要使用Lambda表示式?
僅對比下面的兩個程式碼實現:
// 實現一
Comparator<String> com = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
TreeSet<String> ts = new TreeSet<>(com);
// 實現二:基於Lambda表示式
Comparator<String> com = (x, y) -> Integer.compare(x.length(), y.length());
TreeSet<String> ts = new TreeSet<>(com);
這兩個程式碼都是實現的同一個功能,即建立帶比較器的TreeSet集合,基於Lambda表示式的實現程式碼量少,可讀性強。
備註:篇幅有限,此處僅給出一個對比,有興趣可以再深入學習。
擴充套件面試題
問:引數列表中為什麼可以省略引數型別?
Java8提供了「型別推斷」機制。Java編譯器可以根據上下文在後臺推斷出引數的型別,故無需在引數列表中指定引數型別。
推薦閱讀
歡迎關注
Java名企面試吧,隔天10點24分,我們不見不散!
丙子先生的宗旨是,每兩天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。
能力有限,歡迎指教!