λ表達式本質上是一個匿名方法,用來友善地實作函數接口。也就是說,λ表達式主要用于替換以前廣泛使用的内部匿名類。
讓我們來看下面這個例子:
public int add(int x, int y) {
return x + y;
}
轉成λ表達式後是這個樣子:
(int x, int y) -> x + y;
參數類型也可以省略,java編譯器會根據上下文推斷出來:
(x, y) -> x + y; //傳回兩數之和
或者
(x, y) -> { return x + y; } //顯式指明傳回值
λ表達式由三部分組成:參數清單,箭頭(->),以及一個表達式或語句塊。
λ表達式的類型,叫做“目标類型(target type)。λ表達式的目标類型是“函數接口(functional interface),這是java8新引入的概念。它的定義是:一個接口,如果隻有一個顯式聲明的抽象方法,那麼它就是一個函數接口。一般用@functionalinterface标注出來(也可以不标)。舉例如下:
public interface runnable { void run(); }
public interface comparator<t> { int compare(t o1, t o2);}
lambda不是匿名内部類的文法糖,見下。
stream<e> java.util.collection.stream()
傳回stream對象。
stream<t> java.util.stream.stream.filter(predicate<? super t> predicate)
從stream中過濾元素,傳回的stream由與謂詞比對的元素組成。
void java.util.stream.stream.foreach(consumer<? super t> action)
對stream中的每一個元素執行action。
boolean java.util.function.predicate.test(t t)
predicate接口中的方法,評估給定元素是否滿足謂詞。
void java.util.function.consumer.accept(t t)
consumer接口中的方法,此方法對給定的元素進行操作。
通過default關鍵字給接口的方法提供預設實作。
這樣與抽象類的普通方法就差别不大了。
java.util.collection接口的源代碼含有下面的預設接口實作。
default stream<e> stream() {
return streamsupport.stream(spliterator(), false);