您當前的位置:首頁 > 寵物

學習程式設計|Java攻略讀書筆記-Lambda表示式簡介和使用

作者:由 牛客 發表于 寵物時間:2019-04-15

作者:小犀利

連結: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

標簽: file  表示式  Lambda  String  介面