gpt4 book ai didi

java - Lambda 表达式 - 使用 lambda 表达式

转载 作者:行者123 更新时间:2023-12-01 16:43:32 29 4
gpt4 key购买 nike

我开始学习 lambda 表达式,并在以下情况下遇到了以下语句:

interface MyNumber {
double getValue();
}

MyNumber number;

number = () -> 123.54;

当将表达式分配给 myNum 变量时,将创建一个类实例,其中 lambda 表达式重写 MyNumber 接口(interface)的 getValue () 方法并定义其实现。

我不明白这种情况。该类的实例是如何创建的以及用于什么目的?这可能是一个愚蠢的问题,但是......如果给定的功能接口(interface)由多个类实现,那么将创建哪个实例类?我会寻求帮助,因为我完全不明白。

最佳答案

When the expression is assigned to the myNum variable, a class instance is created in which the lambda expression overrides the getValue () method of the MyNumber interface and defines its implementation.

不,那是不正确的。 lambda 是编译器根据需要引用的“一段代码”。这是效率方面的主要优势之一,JVM 在执行程序时不必创建和加载类。

您应该在发布问题之前测试您的示例,因为它是不正确的。 MyNumber接口(interface)不是作为数据类型而是作为方法定义。应该是:

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();

这里接口(interface)以两种不同的方式实现,但没有定义任何类(MyNumberSupplier 接口(interface)除外),仅定义了根据需要引用的代码片段。一个@FunctionalInterface由于 lambda 表达式只能是一段代码,因此只能有一种方法。

最后,需要注意的是,java 8 中包含的 java.util.function 包中有很多预定义的接口(interface)。例如 java.util.function.Supplier<T> 。然后你的代码可以写成:

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

关于java - Lambda 表达式 - 使用 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797824/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com