您的建议
您的建议之前已在 lambda-dev 邮件列表中讨论过:
http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html
它被拒绝的主要原因是解析器/编译器会出现与歧义相关的各种问题。或者用 Brian Goetz 的话说:
我认为,归根结底,这只是对函数接口而不是函数类型的承诺感到不舒服,并试图退回到一个软弱无力的中间立场。我不认为这提供了足够令人信服的好处。
如果你觉得这样“欲言又止”特性仍然会为 Java 语言增加价值,您可以在 lambda 邮件列表之一上再次碰碰运气,也许有令人信服的论据:-)
替代
这是可能的,但可能不像 JavaScript 中的示例语法所建议的那样优雅。据最新消息Brian Goetz 的 lambda 状态 http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html,会有章节中提到的方法参考
8 方法参考
[...]
9种方法参考
[...]实际上存在三种不同类型的方法引用,每种
语法略有不同:
- 静态方法
- 特定对象的实例方法
- 特定类型的任意对象的实例方法
因此,事实上,您的示例必须按照以下方式重新表述:
interface Func { void execute(int i); }
void call(Block<Integer> block)
{
block.run(1); //instead of f.execute(1);
}
您现在可以传递对该执行方法的引用:
// Disclaimer: I didn't check this against a JDK8 compiler...
Func f = (i) -> { ; }; // Empty sample implementation
call(f::execute)
换句话说,“函数式”样式将在调用方法的声明站点实现,而不是在使用站点实现。但与 JavaScript 一样,使用站点不必知道具体方法的名称Func
。它只能接受一个Block
对于返回的方法void
, or a Callable
对于返回值的方法。
请注意,在 JDK 的 Mercurial 存储库中,情况已经发生了变化。你不会发现run()
不再如此,如 lambda 状态中所述。其他有趣的类型可以在 java.util.functions 包中找到:
http://hg.openjdk.java.net/lambda/lambda/jdk/file/tip/src/share/classes/java/util/function http://hg.openjdk.java.net/lambda/lambda/jdk/file/tip/src/share/classes/java/util/function