但是,我想知道反向是否可能,因为我有一个方法只是将其参数代理到lambda:
Function<Arg, Result> lambda = (a) -> new Result(a);
public Result myMethod(Arg arg) {
return lambda.apply(a);
}
在谷歌上没有找到任何东西,所以我想这是不可能的。这是有道理的,因为毕竟,正如我所理解的,lambda只是整个界面的简写。方法和界面是不同的。但你可以从一个方法创建一个lambda,所以也许你可以用lambda创建一个方法吗?
答案 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表达式应该只包含相当小的,通常是微不足道的代码。