學習程式設計|Java攻略讀書筆記-Lambda表示式簡介和使用
作者:小犀利
連結:https://www。nowcoder。com/discuss/127423
一、Lambda表示式簡介
“Lambda 表示式”(lambda expression)是一個匿名函式,即沒有函式名的函式;Lambda表示式不僅讓程式碼變的簡單、而且可讀、最重要的是程式碼量也隨之減少很多。
Java Lambda表示式的一個重要用法是簡化某些匿名內部類(Anonymous Classes)的寫法。
二、Lambda基礎語法
基本語法:(parameters) -> expression或(parameters) ->{ statements; }
下面是一些Java lambda表示式的簡單例子:
() -> 1
// 1。 不需要引數,返回值為 1
x -> 3 * x
// 2。 接收一個引數(數字型別),返回其3倍的值
(x, y) -> x + y
// 3。 接受2個引數,並返回x+y
(int x, int y) -> x + y
// 4。 接收2個int型整數,返回兩值的和
(String s) -> System。out。print(s)
// 5。 接受一個 string 物件,並在控制檯列印,不返回任何值(看起來像是返回void)
三、lambda取代某些匿名內部類
下面介紹如何使用Lambda表示式簡化匿名內部類的書寫,但Lambda表示式並不能取代所有的匿名內部類,只能用來取代函式式介面(Functional Interface)的簡寫。
函式式介面是一種包含單一抽象方法(single abstract method)的介面。類透過為介面中的所有方法提供實現來實現任何介面,這可以透過頂級類、內部類甚至匿名內部類完成。
3.1 無參函式的簡寫
·例子1-1 Runnable介面的匿名內部類實現
public class RunnableDemo{
public static void main(String[] args) {
new Thread(new Runnable(){// 介面名
public void run(){// 方法名
System。out。println(“run test()”);
}
})。start();
//以上程式碼給Tread類傳遞了一個匿名的Runnable物件
//過載Runnable介面的run()方法來實現相應邏輯
}
}
例子1-2 使用lambda表示式改寫以上程式碼
public class RunnableDemo{
public static void main(String[] args) {
new Thread(() -> System。out。println(“run test()”))。start();
// 省略介面名和方法名
}
}
在本例中,由於println方法返回的是void,所以對應的表示式同樣會返回void,與run方法的型別相匹配
lambda表示式必須匹配介面中單一抽象方法簽名的引數型別和返回型別,這被稱為與方法簽名相容。所以,lambda表示式屬於介面方法的實現,可以將其賦給該介面型別的引用。
比如上述例子,
若要將lambda賦給函式式介面引用可以透過以下例子1-3實現:
Runnable runnable =() -> System。out。println(“run test()”);
new Thread(runnable)。start();
3.2 有參函式的簡寫
例子1-4 FilenameFilter的匿名內部類實現
import java。io。File;
import java。io。FilenameFilter;
import java。util。Arrays;
public class FilenameFilterDemo {
public static void main(String[] args) {
File directory = new File(“src/test/resources”);
String[] names = directory。list(new FilenameFilter() { public boolean accept(File dir, String name) {
return name。endsWith(“。txt”);
}
});
System。out。println(Arrays。asList(names));
}
}
例1-5 採用lambda表示式改寫以上程式碼
import java。io。File;
import java。io。FilenameFilter;
import java。util。Arrays;
public class FilenameFilterDemo {
public static void main(String[] args) {
File directory = new File(“src/test/resources”);
String[] names = directory。list((dir,name)-> name。endsWith(“。txt”));
System。out。println(Arrays。asList(names));
}
}
可以看到,程式碼要簡單的多。引數包含在小括號中,但並未宣告型別。在編譯時,編譯器發現list方法傳入一個FilenameFilter型別的引數,從而獲知其單一抽象方法accept的簽名,進而瞭解accept的引數為File和String,因此相容的lambda表示式引數必須匹配這些型別。由於accept方法返回的型別是布林值,所以箭頭右邊的表示式也必須是返回布林值。
我們也可以在程式碼中指定資料型別,如下例1-6所示:
File directory = new File(“src/test/resources”);
String[] names = directory。list((File dir,String name)-> name。endsWith(“。txt”));
此外,如果lambda表示的實現多於一行,則需要使用大括號和顯示返回語句,如例1-7所示:
File directory = new File(“src/test/resources”);
String[] names = directory。list((File dir,String name)-> {
return name。endsWith(“。txt”);
}
);
這就是lambda程式碼塊,在本例中,雖然程式碼主體只有一行,但是可以使用大括號將多個語句括起來。注意,不能省略return關鍵字。
lambda表示式在任何情況下都不能脫離上下文存在,上下文指定了將表示式賦予給哪個函式式介面。lambda表示式既可以是方法的引數,也可以是方法的返回函式,還可以被賦給引用。無論哪種情況,賦值型別必須為函式式介面。
更多名企筆試真題解析、面試經驗交流、招聘資訊內推,盡在牛客!
求職之前,先上牛客!快快下載拿offer!
與作者交流:
https://www。nowcoder。com/discuss/127423
更多筆經面經:
https://www。nowcoder。com/discuss?order=0&type=2