Java 8中是否可以使用反向方法引用?

时间:2015-07-24 03:48:06

标签: java lambda java-8

我知道lambda method references

但是,我想知道反向是否可能,因为我有一个方法只是将其参数代理到lambda:

Function<Arg, Result> lambda = (a) -> new Result(a);

public Result myMethod(Arg arg) {
    return lambda.apply(a);
}

在谷歌上没有找到任何东西,所以我想这是不可能的。这是有道理的,因为毕竟,正如我所理解的,lambda只是整个界面的简写。方法和界面是不同的。但你可以从一个方法创建一个lambda,所以也许你可以用lambda创建一个方法吗?

2 个答案:

答案 0 :(得分:3)

您无法从lambda创建方法,因为正如您所说,lambda不是方法,更重要的是,您无法通过在运行时向其添加方法来动态更改类。这是Java类的基本设计不变量。可以使用您自己的实现动态响应接口的预定义方法,尽管它相当笨重。看看http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html

答案 1 :(得分:3)

变量lambda的类型Function没有说明实例的创建方式。它可能是一个lambda表达式,但它没有必要。也就是说,如果您要将myMethod委托给Function中声明的方法,则没有理由自动选择该abstract的{​​{1}}方法,因此,类似于方法引用,您必须指定目标方法,如interface,以明确您想要的方法,而不是other methods of the interface Function之一。

但与使用目标类型的方法引用不同,您无法从周围的上下文派生方法声明,因此您无法保留方法声明。所以这样一个假设的特性仍然需要方法声明,对lambda::apply字段和目标方法名称(lambda)的引用,所以没有太多可以保存的东西可以证明新的语言特色。

无论如何也不需要这样的功能。如果要将代码表示为函数和方法,请将其表示为方法:

而不是

apply

Function<Arg, Result> lambda = (a) -> new Result(a);

public Result myMethod(Arg arg) {
    return lambda.apply(a);
}

但即使代码复制也可以接受,如

Function<Arg, Result> lambda = this::myMethod;

public Result myMethod(Arg arg) {
    return new Result(arg);
}

考虑到lambda表达式应该只包含相当小的,通常是微不足道的代码。