Java8新特性 Lambda表示式

2021-08-16 22:44:51 字數 1972 閱讀 1878

lambda表示式的本質只是乙個語法糖,由編譯器推斷並幫你轉換包裝為常規的**,因此你可以使用更少的**來實現同樣的功能。

基本語法:

(parameters -> expression)

(parameters -> )

簡單例子:

//僅用三行**完成 排序後輸出列表

public

static

void

main(string args)

應用場景如下:根據不同的策略,選出滿足策略條件的蘋果進行分類,而策略經常變更。

public

inte***ce

matchinte***ce

public

class

matchclient

public

static

void

main(string args)

});// lambda表示式實現

return

"red".equals(tmp.getcolor());

});}

}

如上**所示,即便使用匿名類的形式,比起lambda表示式的實現還是複雜許多。更別說定義實現類。顯然可以看出lambda表示式簡潔的特性。但是相較而言,無法復用也是lambda表示式對比實現類的缺陷。然後lambda本身就是針對這種較少使用的場景,因而這也不成問題。

對比匿名類和lambda表示式,很容易看出:

->左邊部分是介面抽象方法的引數,而右邊是抽象方法的具體實現。

對於乙個介面,無論定義了多少個預設方法,只要只定義了乙個抽象方法,那麼這個介面就是函式式介面。

lambda表示式使用在函式式介面的引數位置,現在我們再回頭看示例排序迭代輸出**:

collections.sort(integers, (i1,i2) -> i1.compareto(i2));

public

static

void

sort(listlist, comparator<? super t> c)

public

intcompareto(integer anotherinteger)

public

static

intcompare(int x, int y)

@functionalinte***ce

public

inte***ce

comparator

通過lambda表示式實現comparator介面,達到排序的目的。

integers.foreach(i -> system.out.println(i));

default

void foreach(consumer<? super t> action)

}@functionalinte***ce

public

inte***ce

consumer

顯然這也是對列表的每個元素做accept操作。即輸出到控制台。

使用@functionalinte***ce註解可以提前校驗介面是否是函式式介面

原始碼中提供的幾個函式式介面:

方法引用

如果乙個lambda代表的只是直接呼叫這個方法,那最好使用名稱來呼叫。

構造三種方法引用:

復合lambda

java8新特性之一lambda

lambda結合函式式介面使用,函式式介面 functional inte ce 就是乙個有且僅有乙個抽象方法,但是可以有多個非抽象方法的介面。1 可選型別宣告 不需要宣告引數型別,即直接可以寫引數,不需要宣告型別,編譯器可以自動識別型別 2 可選的引數圓括號 乙個引數可以不要圓括號,多個引數需要圓...

java8新特性 Lambda表示式

private static void comparecreatethread t1 start 建立乙個執行緒 lambda表示式 new thread system.out.printf 執行緒 s 正在執行 n thread.currentthread getname t2 start 執行結...

java8新特性之lambda表示式

lambda表示式需要支援函式式介面 介面中只有乙個抽象方法的介面 可以用 functionalinte ce註解修飾介面,這樣如果定義超過乙個抽象方法就會報錯 幾種格式 格式一 無引數,無返回值 system.out.println hello 格式二 有乙個引數,無返回值 x system.ou...