簡體   English   中英

函數式接口中的函數如何執行 lambda 函數?

[英]How does a function from a functional interface perform a lambda function?

我正在嘗試理解函數式接口和 lambda 函數。而且我找不到函數式接口中的函數如何將它與 lambda 函數連接的解釋,也就是說,假設有這樣一個函數式接口

@FunctionalInterface
interface MyPredicate {
    boolean test(Integer value);
}

現在我們將函數接口的變量分配給 lambda 函數:

public class Tester {
    public static void main(String[] args) throws Exception {
        MyPredicate myPredicate = x -> x > 0;
        System.out.println(myPredicate.test(10));   //true
    }
}

我很想知道為什么在調用myPredicate.test(10)時會調用x > 0 也就是說,我是否正確理解當我們分配一個 lambda 函數時,編譯器以某種方式將函數接口中的函數與 lambda 函數的主體連接起來?只是繼承和覆蓋通常用於此,但編譯器在這里做了它或如何?我會很高興有解釋來理解這個問題

在 Java8 之前的術語中,lambda 表達式究竟是什么?

它是一個匿名類的實例,實現了當前上下文中所需的接口。

所以,要明白

MyPredicate myPredicate = x -> x > 0;

我們必須考慮一些不同的方面。

在這里,需要 lambda 表達式x -> x > 0來給出與MyPredicate兼容的結果。 因此,通過考慮使用該表達式的上下文,它等價於

MyPredicate myPredicate = new MyPredicate() {
    boolean test(Integer whateverName) {
        // some method body
    }
};

現在,lambda 表達式填充了該方法的主體。 x ->部分定義了參數名稱,所以現在我們有

MyPredicate myPredicate = new MyPredicate() {
    boolean test(Integer x) {
        // some method body
    }
};

x > 0定義了主體和要返回的值:

MyPredicate myPredicate = new MyPredicate() {
    boolean test(Integer x) {
        return x > 0;
    }
};

所以,當你調用myPredicate.test(10) ,沒有什么特別的。 myPredicate的(匿名類)實例使用參數10調用其test()方法。 只是這個實例是使用 lambda 表達式語法創建的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM