当前位置: 首页 > 知识库问答 >
问题:

Java的lambda语法的分类是什么?

柯建修
2023-03-14

请解释Java8的lambda方法的语法。

关于lambda函数有很多解释,但我找不到关于语法的彻底解释,而且我发现很难学习正确地复制语法,因为我不明白为什么它们是按原样写的。

下面是我遇到的一个常见的例子,NetBeans:

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        new MainAppJFrame();
    });
}
() -> {
    // do stuff
}
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
        }
    }
}

共有1个答案

戈宏义
2023-03-14

语法为:

arguments -> body

其中参数可以是

>

  • ()

    否则,它们相当于()->{f();}()->{return f();})编译器从调用上下文中推断它,但通常会倾向于后者。

    因此,如果您有两个方法:void handle(supplier ) void handle(Runnable),那么:

    >

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

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

    句柄(()->f()):

    >

  • 如果f()返回void或不能转换为t的类型,则它将调用第二个

    如果有两个SwingUtilities.InvokeLater方法仅在参数列表上不同,会发生什么情况?

    这取决于那些参数列表是什么。如果另一个invokelater也正好有一个参数,并且该参数的类型也是具有一个void*()类型的方法的接口,那么它会抱怨说它无法弄清楚您指的是哪一个方法。

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

  •  类似资料:
    • 问题内容: 请说明Java 8的lambda方法的语法。 关于lambda函数是什么,有很多解释,但是我找不到语法的详尽解释,而且我发现很难正确地正确复制语法,因为我不明白为什么它们会照原样重写。 这是NetBeans提供的一个常见案例: 因此,以下lambda表达式可以解析为匿名Runnable对象的run()方法: 该->是lambda语法正确的,对不对?花括号只包含匿名方法代码。括号是否为空

    • 问题内容: 我迅速在Google上找到了答案,但找不到/认为准确的搜索参数。 我正在自学Java,但似乎找不到某种语法的含义。 这意味着什么?我模糊地记得箭头括号与向量有关,但是根据上面的代码,我感觉到它与枚举有关。 任何帮助或澄清将不胜感激。谢谢。 问题答案: 这些称为泛型。 通常,这些在定义类,接口和方法时使 类型 (类和接口)成为参数。 与使用非泛型代码相比,使用泛型有很多好处,如Java教

    • 问题内容: 以下这部分代码是什么意思?我什至不知道这个语法叫什么。 这是原始代码(可从此处找到:http : //developer.android.com/guide/components/processes-and- threads.html ): 问题答案: 告诉AsyncTask使用3种不同的类型进行描述,当您使用AsyncTask时,将String作为第一个参数,将Void作为第二个参数

    • 问题内容: 我意识到Java 8 lambda实现可能会发生变化,但是在lambda build b39中,我发现仅当lambda表达式返回非空类型时才可以省略花括号。例如,这将编译: 但是删除这样的括号: 给出错误 谁能解释这是怎么回事? 问题答案: 当lambda主体是单个表达式或void方法调用时,可以省略花括号。每个表达式都求值,因此不能为空。 如果lambda的主体是语句块(例如,一系列

    • 问题内容: 这些方法之间在功能上有区别吗? 编辑(从其他贡献者添加了此语法): 问题答案: 不,但第一个是首选样式。 编辑: 另一个选项是 此外,它还允许调用者使用varargs语法。

    • 问题内容: 我被要求在我的编码中使用增强循环。 我只学习了如何使用传统循环,因此不知道它和增强循环之间的区别。 增强循环与Java中的传统循环有何不同? 有什么复杂的地方我应该注意哪些教程往往不提? 问题答案: 增强的for循环: 传统的for循环