Java 8 Lambda Expression的Groovy等价物

时间:2014-10-20 02:10:17

标签: java groovy lambda closures java-8

我只使用一种方法获得此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等效项?

2 个答案:

答案 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;
  }