我只使用一种方法获得此Java接口。
// Java Interface
public interface AuditorAware {
Auditor getCurrentAuditor();
}
我正在使用Java 8 Lambda表达式创建AuditorAware
以下的内容。
// Java 8 Lambda to create instance of AuditorAware
public AuditorAware currentAuditor() {
return () -> AuditorContextHolder.getAuditor();
}
我正在尝试在Groovy中编写Java实现。
我看到有很多方法可以在groovy中实现接口,如 Groovy ways to implement interfaces 文档中所示。
我已经在Java代码上实现了groovy等效,通过使用带有map的实现接口,如上面提到的文档所示。
// Groovy Equivalent by "implement interfaces with a map" method
AuditorAware currentAuditor() {
[getCurrentAuditor: AuditorContextHolder.auditor] as AuditorAware
}
但实现具有闭包方法的接口似乎更简洁,如文档示例所示。但是,当我尝试按如下方式实施时,IntelliJ
会显示错误,指出模糊代码块。
// Groovy Equivalent by "implement interfaces with a closure" method ???
AuditorAware currentAuditor() {
{AuditorContextHolder.auditor} as AuditorAware
}
如何通过使用“使用闭包实现接口”方法将Java 8 lambda实现更改为groovy等效项?
答案 0 :(得分:4)
由Dylan Bijnagte评论,以下代码有效。
// Groovy Equivalent by "implement interfaces with a closure" method
AuditorAware currentAuditor() {
{ -> AuditorContextHolder.auditor} as AuditorAware
}
Documentation on Groovy Closure的参数注释解释了这一点。
答案 1 :(得分:4)
您可以使用.&
运算符来获取方法参考:
class Auditor {
String name
}
interface AuditorAware {
Auditor getCurrentAuditor()
}
class AuditorContextHolder {
static getAuditor() { new Auditor(name: "joe") }
}
AuditorAware currentAuditor() {
AuditorContextHolder.&getAuditor
}
assert currentAuditor().currentAuditor.name == "joe"
在Java 8中,您可以使用::
进行方法引用:
AuditorAware currentAuditor() {
return AuditorContextHolder::getAuditor;
}