将java的允许使用功能接口的方法呢?(Will java allow to use functio

2019-08-02 05:08发布

随着新的Java lambda表达式和功能接口的概念,将有可能用于治疗那些功能接口的方法呢?

interface Func { void execute(int i); }

void call(Func f)
{
    f(1); //instead of f.execute(1);
}

我发现了很多关于实际lambda表达式的语法,但没有这方面的信息。

Answer 1:

你的主张

你提出了什么之前,λ-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



Answer 2:

如果我理解正确你的问题,你暗示,鉴于功能接口映射声明如下

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的未来发布此功能的邮件列表中读取。 但是,我想你可以问的问题拉姆达邮件列表 。 我没有看到一个原因,这可能无法实现。



文章来源: Will java allow to use functional interfaces as methods?