繁体   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