gpt4 book ai didi

java - Java 的 lambda 语法的分割是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:05:32 29 4
gpt4 key购买 nike

请解释 Java 8 的 lambda 方法的语法。

对于什么 lambda 函数有很多解释,但我找不到语法的详尽解释,而且我发现学习复制语法非常困难正确,因为我不明白为什么它们是这样写的。

这是我遇到的一个常见情况,由 NetBeans 提供:

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MainAppJFrame();
});
}

所以不知何故,以下 lambda 表达式解析为匿名 Runnable 对象的 run() 方法:

() -> {
// do stuff
}

-> 是正确的 lambda 语法,对吗?花括号只是包含匿名方法代码。括号是否是一个空参数,因为在这种情况下我们正在创建一个 Runnable.run() 方法?

这一切我都不清楚。我假设编译器知道根据 SwingUtilities.invokeLater(Runnable) 方法预期的类型来实例化匿名 Runnable 吗?如果有两个仅在参数列表上不同的 SwingUtilities.invokeLater 方法会发生什么?显然在这种特定情况下没有,但在其他地方是可能的:

interface ExampleLambdaConsumer {
public void doSomething(Runnable r);
public void doSomething(java.lang.reflect.Method m);
}

class C implements ExampleLambdaConsumer {
// implementations for doSomething methods here

public static void main(String[] args) {
doSomething(() -> {
// lambda method body here
}
}
}

最佳答案

语法是:

arguments -> body

在哪里 arguments可以是

  • ()

  • 如果可以从上下文中推断出该变量的类型,则为单个变量

  • 括号中的变量序列,有或没有类型(或从 Java 11 开始,有 var )。
    示例:(x) , (x, y) , (int x, int y) , (var x, var y) (Java 11+)。
    以下内容无效:(int x, y) , (x, var y) , (var x, int y)

body可以是表达式或 {...}语句 block 。表达式(除了方法或构造函数调用)被简单地返回,即 () -> 2相当于 () -> {return 2;}


对于像 () -> f() 这样的 lambda 表达式(主体是方法或构造函数调用表达式):

  • 如果 f()返回 void ,它们等价于 () -> { f(); }

  • 否则,它们等同于 () -> { f(); }() -> { return f(); }) .编译器从调用上下文推断它,但通常它会更喜欢后者。

因此,如果您有两种方法:void handle(Supplier<T>)void handle(Runnable) ,那么:

  • handle(() -> { return f(); })handle(() -> x)将调用第一个,

  • handle(() -> { f(); }将调用第二个,并且

  • handle(() -> f()) :

    • 如果 f()返回 void或不能转换为 T 的类型,然后它会调用第二个

    • 如果 f()返回可转换为 T 的类型,然后它会调用第一个


编译器尝试将 lambda 的类型与上下文相匹配。我不知道确切的规则,但答案是:

What would happen if there were two SwingUtilities.invokeLater methods which differ only in parameter list?

is:这取决于那些参数列表是什么。如果其他invokeLater也恰好有一个参数,并且该参数的类型也是与 void*() 类型的一种方法的接口(interface),好吧,那么它会提示它无法弄清楚您的意思是哪种方法。

为什么要这样写?好吧,我认为这是因为 C# 和 Scala 中的语法几乎相同(它们使用 => 而不是 -> )。

关于java - Java 的 lambda 语法的分割是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25192108/

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