Groovy相当于Java 8 ::(双冒号)运算符

Wav*_*vyx 13 groovy

Groovy中的Java 8 ::(双冒号运算符)相当于什么?

我试图在groovy中翻译这个例子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);
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*Rog 12

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)
}
Run Code Online (Sandbox Code Playgroud)

注意这里使用Groovy属性表示法,并且必须将其Closure转换@FunctionalInterfacemapString()or mapDate()方法所期望的类型.

  • Java 8 ::(双冒号)将于2017年添加https://twitter.com/glaforge/status/814890698369593348 (4认同)
  • 截至目前(2.6.0-alpha-2)无效.但有没有人知道这是否会被添加到Groovy 2或Groovy 3,目前被描述为"前沿"(http://groovy-lang.org/download.html)? (2认同)

sma*_*c89 5

从 Groovy 3(测试版)开始,groovy 现在支持java 8 冒号语法(以及更多)。

因此,您拥有的示例在 groovy 中的工作方式完全相同。