随着新的Java lambda表达式和功能接口的概念,将有可能用于治疗那些功能接口的方法呢?
interface Func { void execute(int i); }
void call(Func f)
{
f(1); //instead of f.execute(1);
}
我发现了很多关于实际lambda表达式的语法,但没有这方面的信息。
随着新的Java lambda表达式和功能接口的概念,将有可能用于治疗那些功能接口的方法呢?
interface Func { void execute(int i); }
void call(Func f)
{
f(1); //instead of f.execute(1);
}
我发现了很多关于实际lambda表达式的语法,但没有这方面的信息。
你提出了什么之前,λ-dev邮件列表上的讨论:
http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html
这主要是拒绝,因为涉及到将出现解析器/编译器不确定性的各种问题。 或作者Brian Goetz的话来说:
我认为,归根结底,这是与committment功能性接口,而不是函数类型,并企图向软弱无力的中间地带走回头路只是不适。 我不认为这是提供一个令人信服的足够的好处。
如果你觉得这样的“软弱无力”的特点仍然会增加价值的Java语言,你可以在拉姆达的邮件列表再次试试你的运气,也许有令人信服的理由:-)
这是可能的,但可能并不像优雅在JavaScript作为你的榜样语法建议。 根据最新的Brian Goetz撰写国家的最拉姆达 ,会出现在章节提到的方法引用
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
,或Callable
返回值的方法。
请注意,在JDK的Mercurial库,事情都已经改变了。 你不会找到run()
更多,因为在lambda的状态提及。 其他有趣的类型可以在java.util.functions包中找到:
http://hg.openjdk.java.net/lambda/lambda/jdk/file/tip/src/share/classes/java/util/function
如果我理解正确你的问题,你暗示,鉴于功能接口映射声明如下
interface Mapper<T,U> {
public U map(T t);
}
如果我实现与lambda表达式此功能界面如下:
Mapper<Integer,String> itoa = (n) -> String.valueOf(n);
您想调用功能界面如下:
String val = itoa(10); //would yield "10"
而不是今天是:
String val = itoa.map(10);
我想,第一次调用是第二个语法糖。
我还没有任何文件,或者他们计划提供的JDK的未来发布此功能的邮件列表中读取。 但是,我想你可以问的问题拉姆达邮件列表 。 我没有看到一个原因,这可能无法实现。