天天看點

java8新特性 (λ、stream 與 預設接口方法)1.lambda2.stream3.預設接口方法

λ表達式本質上是一個匿名方法,用來友善地實作函數接口。也就是說,λ表達式主要用于替換以前廣泛使用的内部匿名類。 

讓我們來看下面這個例子:

    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);