2014-10-20 50 views
6

我只有一種方法獲得了此Java接口。用於Java 8的Groovy等效表達式

// 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代碼,通過使用上面提到的文檔中顯示的map實現接口來實現groovy等價物。

// 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

你試過指定關閉不離開 - > out?{ - > AuditorContextHolder.auditor}也是沒有必要的,如果你正在使用Groovy 2.2+ – 2014-10-20 02:32:09

+0

@DylanBijnagte謝謝。這工作。另外,我正在使用'groovy 2.3.6'。 – TheKojuEffect 2014-10-20 04:47:22

回答

3

可以使用.&接線員給的方法參考:

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; 
    } 
+0

謝謝。方法參考也很酷。 – TheKojuEffect 2014-10-22 16:08:30