2014-10-20 22 views
6

Mam ten interfejs Java tylko z jedną metodą.Groovy odpowiednik dla Java 8 Lambda Expression

// Java Interface 
public interface AuditorAware { 
    Auditor getCurrentAuditor(); 
} 

używałem Java 8 wyrażenia lambda do tworzenia insance z AuditorAware następująco.

// Java 8 Lambda to create instance of AuditorAware 
public AuditorAware currentAuditor() { 
    return() -> AuditorContextHolder.getAuditor(); 
} 

Próbuję napisać powyżej implementacji Java w Groovy.

Widzę, że istnieje wiele sposobów na wdrożenie interfejsów w doskonałej jakości, jak pokazano w niniejszej dokumentacji: Groovy ways to implement interfaces.

Zaimplementowałem powyższy kod Java, aby uzyskać ekwiwalent groovy przy użyciu interfejsów narzędziowych z mapą, jak pokazano w wyżej wymienionej dokumentacji.

// Groovy Equivalent by "implement interfaces with a map" method 
AuditorAware currentAuditor() { 
    [getCurrentAuditor: AuditorContextHolder.auditor] as AuditorAware 
} 

Ale interfejsy implementujące metodę zamknięcia wydają się bardziej zwięzłe, jak pokazano na przykład w dokumentacji. Jednak, gdy próbuję wykonać w następujący sposób, IntelliJ pokazuje błędy mówiąc: Niejednoznaczny blok kodu.

// Groovy Equivalent by "implement interfaces with a closure" method ??? 
AuditorAware currentAuditor() { 
    {AuditorContextHolder.auditor} as AuditorAware 
} 

Jak mogę zmienić implementację lambda 8 i uzyskać ekwiwalent groovy za pomocą metody "implementuj interfejsy z zamknięciem"?

+2

próbowałeś określając zamknięcie bez opuszczania -> out? {-> AuditorContextHolder.auditor} również nie jest konieczne, jeśli korzystasz z Groovy 2.2+ –

+0

@DylanBijnagte Dzięki. To się udało. Ponadto używam 'groovy 2.3.6'. – TheKojuEffect

Odpowiedz

4

Zgodnie z komentarzem użytkownika Dylan Bijnagte, poniższy kod zadziałał.

// Groovy Equivalent by "implement interfaces with a closure" method 
AuditorAware currentAuditor() { 
    { -> AuditorContextHolder.auditor} as AuditorAware 
} 

Sekcja Paramter Uwagi z Documentation on Groovy Closure wyjaśnić.

3

Można użyć operatora .& aby uzyskać odwołanie metoda:

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" 

W Javie 8 można użyć :: o referencje Metoda:

AuditorAware currentAuditor() { 
    return AuditorContextHolder::getAuditor; 
    } 
+0

Dziękuję. Odniesienie do metody jest również fajne. – TheKojuEffect

Powiązane problemy