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...