[英]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.