2016-12-30 80 views
6

Groovy中的Java 8 ::(double colon operator)等效於什麼?Groovy等價於Java 8 ::(雙冒號)運算符

我想翻譯在常規https://github.com/bytefish/PgBulkInsert

這個例子但是映射部分以相同的方式不起作用如Java 8:

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

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

似乎Groovy方法指針運算符'。&'是接近的,但期望聲明類的一個實例。 – manouti

+0

的確,我需要一個Groovy類的「功能接口」。 https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html – Wavyx

+3

很難說如果沒有看到你的mapString()和mapDate() '方法,但也許像這樣的東西會工作:'mapString(「first_name」,{it.firstName} as Function)''。它不像java 8中的函數指針到lambda-to-Functional-interface符號那樣高效,但我認爲它的工作原理是一樣的。 – BalRog

回答

6

Groovy中並沒有真正有實例離婚實例方法參考(編輯:。請參閱Wavyx對此答案的評論。),所以相反,你必須用閉包僞造它。在Java 8中使用實例方法引用語法時,您確實設置了一個lambda的等價物,該lambda需要調用實例作爲其第一個(在此情況下爲唯一的)參數。

因此,爲了在Groovy中獲得相同的效果,我們必須創建一個使用默認it參數作爲調用實例的閉包。就像這樣:

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) 
} 

注意使用Groovy的屬性符號的在這裏,而且有必要鑄Closure@FunctionalInterface類型由mapString()mapDate()方法的預期。

+4

Java 8 ::(雙冒號)將於2017年加入https://twitter.com/glaforge/status/814890698369593348 – Wavyx

+0

這是否已發佈? –

+0

不知道。您可以嘗試發送推文「glaforge」進行更新(請參閱Wavyx評論中的鏈接)。我聽說他非常敏感。 – BalRog