【发布时间】:2016-01-15 16:34:44
【问题描述】:
我正在从 Java 迁移到 Groovy,并且遇到了方法引用问题。
在 Java 中,我可以这样做:
Function<Bean, String> f = Bean::method;
String s = f.apply(new Bean());
我想在 Groovy 中实现相同的功能。我试着做:
Function f = Bean.&method
Sting s = f.apply new Bean()
但我遇到了一个例外,在 f.apply 行:
groovy.lang.MissingMethodException: No signature of method: Bean.method() is applicable for argument types: (Bean) values: [Bean@17483c58]
我知道我可以执行以下操作来获取实例方法的方法引用,但我想获取任何实例的通用方法。
MethodClosure f = bean.&method
String s = f()
我想用它来使用 EasyBind 库。它允许您选择带有函数引用的 JavaFX 属性。您可能有一个类和属性的层次结构,要选择它们,您可以这样做:
property.bind(EasyBind.select(root).select(Root::branch).selectObject(Branch::leaf));
因此,当树中的任何值发生更改时,property 会更新为正确的值。
我可以将Bean.&method 替换为{bean -> bean.method},并且效果很好。在 Java 中,Bean::method 实际上是 bean -> bean.method 的别名类型。
【问题讨论】:
-
AFAIK 这是不可能的。仅适用于静态方法。
-
@Opal 这不鼓励我使用 Groovy 来做我当时正在做的事情:/
-
也许能给我们一个更广泛的背景?
-
我用使用更新了我的问题。
-
我认为您应该发布您的解决方案作为答案。看起来不错。你也可以选择
{ it.method }