簡體   English   中英

Lambda表達式-使用Lambda表達式

[英]Lambda expressions - use lambda expression

我開始學習lambda表達式,並在以下情況下遇到了以下語句:

interface MyNumber {
    double getValue();
}

 MyNumber number;

 number = () -> 123.54;

將表達式分配給myNum變量后,將創建一個類實例,其中lambda表達式將覆蓋MyNumber接口的getValue()方法並定義其實現。

我不了解這種情況。 這個類的實例是如何創建的? 這可能是一個愚蠢的問題,但是...如果給定的功能接口由多個類實現,那么將創建哪個實例類? 我會尋求幫助,因為我完全不理解。

將表達式分配給myNum變量后,將創建一個類實例,其中lambda表達式將覆蓋MyNumber接口的getValue()方法並定義其實現。

不,那是不正確的。 lambda是編譯器根據需要引用的“代碼段”。 就效率而言,這是主要優勢之一,JVM在執行程序時不必創建和加載類。

您應該在發布問題之前測試示例,因為它不正確。 MyNumber接口不是充當數據類型,而是充當方法定義。 它應該是:

interface MyNumberSupplier {
    double getValue();
}

MyNumberSupplier numberSupplier = () -> 123.45;
double d1 = numberSupplier.getValue();

在這里,您可以看到lambda表達式是一段代碼,該代碼返回用於設置d1的值。 在這種情況下,代碼返回文字值123.45並且在需要設置d1時,編譯器僅引用該代碼代替numberSupplier.getValue(); 線。 您可以擴展該示例以使用更復雜的代碼:

MyNumberSupplier getLess100 = () -> Math.random() * 100.0;
MyNumberSupplier getMore100 = () -> Math.random() * 100.0 + 100.0;
double d1;
if ( Math.random() < 0.5)
    d1 = getLess100.getValue(); 
else 
    d1 = getMore100.getValue(); 

在這里,接口已通過兩種不同的方式實現,但MyNumberSupplier任何類( MyNumberSupplier接口除外),僅根據需要引用了幾段代碼。 @FunctionalInterface只能有一種方法,因為lambda表達式只能是一段代碼。

最后,您應該注意Java 8中包含的java.util.function包中有許多預定義的接口,例如java.util.function.Supplier<T> 您的代碼可以這樣寫:

Supplier<Double> myNumber= () -> 123.45;
double d1 = myNumber.get(); 

Lambda表達式就像在jdk1.8之前創建一個inner class

MyNumber number = new Mynumber(){
@Override
public double getValue(){
return (value);
}

};

暫無
暫無

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

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