第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Lambda 表達(dá)式的語(yǔ)法

本節(jié)我們將介紹 Lambda 表達(dá)式的語(yǔ)法,了解 Lambda 表達(dá)式的基本形式和幾種變體,以及編譯器是怎么理解我們的 Lambda 表達(dá)式的。
掌握了這些基礎(chǔ)的知識(shí),我們就能很容易的辨別出 Lambda 表達(dá)式,以及它是怎么運(yùn)作的。

1. 基本語(yǔ)法

現(xiàn)在我們來(lái)回顧下第一 個(gè) Lambda 表達(dá)式的例子:

button.addActionListener(event -> System.out.println("button click"));

這是一個(gè)最基本的 Lambda 表達(dá)式,它由三部分組成具體格式是這樣子的:

參數(shù) -> 具體實(shí)現(xiàn)

包含一個(gè) Lambda 表達(dá)式的運(yùn)算符 ->,在運(yùn)算符的左邊是輸入?yún)?shù),右邊則是函數(shù)主體。

概括來(lái)講就是:

Tips: 一段帶有輸入?yún)?shù)的可執(zhí)行語(yǔ)句塊

Lambda 表達(dá)式有這么幾個(gè)特點(diǎn):

  1. 可選類(lèi)型聲明: 不需要聲明參數(shù)類(lèi)型,編譯器可以自動(dòng)識(shí)別參數(shù)類(lèi)型和參數(shù)值。在我們第一個(gè)例子中,并沒(méi)有指定 event 到底是什么類(lèi)型;
  2. 可選的參數(shù)圓括號(hào): 一個(gè)參數(shù)可以不用定義圓括號(hào),但多個(gè)參數(shù)需要定義圓括號(hào);
  3. 可選的大括號(hào): 如果函數(shù)主體只包含一個(gè)語(yǔ)句,就不需要使用大括號(hào);
  4. 可選的返回關(guān)鍵字: 如果主體只有一個(gè)表達(dá)式返回值則編譯器會(huì)自動(dòng)返回值,大括號(hào)需要指明表達(dá)式返回了一個(gè)數(shù)值。

這幾個(gè)特點(diǎn)是不是看著有點(diǎn)暈?zāi)兀坎灰o,你只要知道除了我們第一個(gè)例子中的 Lambda 表達(dá)式的基本形式之外,這些特點(diǎn)還能夠形成它的幾種變體。接下來(lái)我們來(lái)看下一個(gè) Lambda 表達(dá)式的一些變體。

2. Lambda 表達(dá)式的五種形式

2.1 不包含參數(shù)

Runnable noArguments = () -> System.out.println("hello world");

在這個(gè)例子中,Runnable 接口,只有一個(gè) run 方法,沒(méi)有參數(shù),且返回類(lèi)型為 void,所以我們的 Lambda 表達(dá)式使用 () 表示沒(méi)有輸入?yún)?shù)。

2.2 有且只有一個(gè)參數(shù)

ActionListener oneArguments = event -> System.out.println("hello world");

在只有一個(gè)參數(shù)的情況下 我們可以把 () 省略。

2.3 有多個(gè)參數(shù)

BinaryOperator<Long> add = (x,y) -> x+y ;

使用 () 把參數(shù)包裹起來(lái),并用 , 來(lái)分割參數(shù)。上面的代碼表示。

2.4 表達(dá)式主體是一個(gè)代碼塊

Runnable noArguments = () -> {
    System.out.print("hello");
    System.out.println("world");
}

當(dāng)有多行代碼的時(shí)候我們需要使用 {} 把表達(dá)式主體給包裹起來(lái)。

2.5 顯示聲明參數(shù)類(lèi)型

BinaryOperator<Long> add = (Long x, Long y) -> x+y ;

通常 Lambda 的參數(shù)類(lèi)型都有編譯器推斷得出的,也可以顯示的聲明參數(shù)類(lèi)型。

3. 關(guān)于 Lambda 表達(dá)式的參數(shù)類(lèi)型

我們?cè)賮?lái)看一下 2.3 的例子:

BinaryOperator<Long> add = (x,y) -> x+y ;

在這個(gè)例子中,參數(shù) x,y 和返回值 x+y 我們都沒(méi)有指定具體的類(lèi)型,但是編譯器卻知道它是什么類(lèi)型。原因就在于編譯器可以從程序的上下文推斷出來(lái),這里的上下文包含下面 3 種情況:

  • 賦值上下文;
  • 方法調(diào)用上下文;
  • 類(lèi)型轉(zhuǎn)換上下文。

通過(guò)這 3 種上下文就可以推斷出 Lambda 表達(dá)式的目標(biāo)類(lèi)型。

目標(biāo)類(lèi)型并不是一個(gè)全新的概念,通常我們?cè)?Java 數(shù)據(jù)初始化的時(shí)候就是根據(jù)上下文推斷出來(lái)的。比如:

String[] array = {"hello","world"};

等號(hào)右邊的代碼我們并沒(méi)有聲明它是什么類(lèi)型,系統(tǒng)會(huì)根據(jù)上下文推斷出類(lèi)型的信息。

4. 小結(jié)

本節(jié)主要介紹了:

  • Lambda 表達(dá)式的基本語(yǔ)法及其幾種變體形式。
  • 在 Lambda 表達(dá)式中,編譯器會(huì)根據(jù)程序的上下文自動(dòng)推斷出目表達(dá)式的目標(biāo)類(lèi)型。

掌握這些知識(shí)可以幫助我們快速的辨別一個(gè) Lambda 表達(dá)式,方便的去理解程序的意圖。