2016-12-30 56 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