请说明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