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