当前位置: 首页 > 面试题库 >

Java的lambda语法有哪些细分?

岳浩宕
2023-03-14
问题内容

请说明Java 8的lambda方法的语法。

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

这是NetBeans提供的一个常见案例:

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

因此,以下lambda表达式可以解析为匿名Runnable对象的run()方法:

() -> {
    // do stuff
}

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

这对我来说还不清楚。我假设编译器知道Runnable根据该SwingUtilities.invokeLater(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可

  • ()

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

  • var括号中的变量序列,带有或不带有类型(或者从Java 11开始,带有)。
    例如:(x),(x, y),(int x, int y),(var x, var y)(Java 11+)
    以下是无效的:(int x, y),(x, var y),(var x, int y)

并且body可以是一个表达式或一{…}与语句块。只需返回表达式(而不是方法或构造函数调用),即() -> 2等于() -> {return 2;}

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

  • 如果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的类型与上下文匹配。我不知道确切的规则,但答案是:

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

是:这取决于那些参数列表。如果invokeLater另一个参数也恰好有一个参数,并且该参数的类型也是一个类型为的方法的接口void*(),那么它会抱怨说它无法弄清楚你要使用的方法。

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



 类似资料:
  • 本文向大家介绍Java 语言有哪些特点?相关面试题,主要包含被问及Java 语言有哪些特点?时的应答技巧和注意事项,需要的朋友参考一下 简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); 可靠性; 安全性; 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 支持网

  • 我很奇怪为什么网上关于线程组的文档这么少?它们是仍然被使用还是它们是一些陈腐的概念?有人能解释一下吗: > 它们是什么。 它们是用来做什么的。 如果不使用,在哪里使用? 给出一些真实的应用程序示例(比如,也许)。

  • 本文向大家介绍JS的语言特性有哪些?相关面试题,主要包含被问及JS的语言特性有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 运行在客户端浏览器上; 不用预编译,直接解析执行代码; 是弱类型语言,较为灵活; 与操作系统无关,跨平台的语言; 脚本语言、解释性语言  

  • 本文向大家介绍知道哪些ES6,ES7的语法?相关面试题,主要包含被问及知道哪些ES6,ES7的语法?时的应答技巧和注意事项,需要的朋友参考一下 promise,await/async,let、const、块级作用域、箭头函数 ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

  • 问题内容: java中static关键字的用法有哪些? 问题答案: static 成员属于类而不是特定实例。 这意味着即使你创建了该类的一百万个实例,也没有创建任何实例,该字段仅存在一个实例[1]。它将被所有实例共享。 由于方法也不属于特定实例,因此它们不能引用实例成员。在给定的示例中,不知道应引用该类的哪个实例(以及该类的哪个实例)。成员只能引用成员。实例成员当然可以访问成员。 旁注:当然,成员

  • 本文向大家介绍Java 容器都有哪些?相关面试题,主要包含被问及Java 容器都有哪些?时的应答技巧和注意事项,需要的朋友参考一下 Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示: Collection List ArrayList LinkedList Vector Stack Set HashSet LinkedHashSet TreeSet Map