1. 程式人生 > >基礎 | Java8新特性之Lambda表示式

基礎 | Java8新特性之Lambda表示式

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分,我們不見不散!

丙子先生的宗旨是,每兩天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。

能力有限,歡迎指教!