2016-12-30 15 views
6

Jaki byłby odpowiednik Javy 8 :: (double colon operator) w Groovy?Groovy odpowiednik operatora Java 8 :: (podwójny dwukropek)

Próbuję tłumaczyć ten przykład w Groovy https://github.com/bytefish/PgBulkInsert

ale część odwzorowania nie działa w ten sam sposób jak Java 8:

public PersonBulkInserter() { 
    super("sample", "unit_test"); 

    mapString("first_name", Person::getFirstName); 
    mapString("last_name", Person::getLastName); 
    mapDate("birth_date", Person::getBirthDate); 
} 
+2

Wygląda na to, że operator wskaźnika '. &' Jest zamknięty, ale oczekuje wystąpienia klasy deklarującej. – manouti

+0

Rzeczywiście, potrzebowałbym "Funkcjonalnego interfejsu" dla klasy Groovy. https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html – Wavyx

+3

Trudno powiedzieć, nie widząc kodu dla 'mapString()' i 'mapDate() 'metody, ale może coś takiego by działało:' mapString ("first_name", {it.firstName} as Function) '. To nie jest tak wydajne, jak notacja funkcji-pointer-to-lambda-do-Functional-interface w java 8, ale myślę, że to zadziała tak samo. – BalRog

Odpowiedz

6

Groovy tak naprawdę nie ma instancji rozwiedziony referencje instancji metody (EDYCJA: Jeszcze. Zobacz komentarz Wavyx na temat tej odpowiedzi.), więc zamiast tego musisz sfałszować go z zamknięciami. Podczas używania składni referencyjnej metoda-metoda w Javie 8, tak naprawdę ustawiasz odpowiednik lambda, który oczekuje instancji wywołującej jako swojego pierwszego (w tym przypadku tylko) argumentu.

Tak więc, aby uzyskać ten sam efekt w Groovy, musimy utworzyć zamknięcie, które używa domyślnego argumentu it jako instancji wywołującej. Tak:

PersonBulkInserter() { 
    super("sample", "unit_test") 

    mapString("first_name", { it.firstName } as Function) 
    mapString("last_name", { it.lastName } as Function) 
    mapDate("birth_date", { it.birthDate } as Function) 
} 

Zauważ użycie notacji własności Groovy tutaj, i że jest to niezbędne do oddania Closure do @FunctionalInterface typu oczekiwanego metodą mapString() lub mapDate().

+4

Java 8 :: (podwójny dwukropek) zostanie dodany w 2017 https://twitter.com/glaforge/status/814890698369593348 – Wavyx

+0

Czy to zostało wydane? –

+0

Brak pomysłu. Możesz spróbować tweetowania "glaforge" w celu aktualizacji (zobacz link w komentarzu Wavyx'a). Słyszałam, że on jest dość wrażliwy. – BalRog

Powiązane problemy