Groovy 相当于 Java 8 ::(双冒号)运算符
Groovy equivalent of Java 8 :: (double colon) operator
Groovy 中的 Java 8 :: (double colon operator) 相当于什么?
我正在尝试将此示例翻译成 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);
}
Groovy 并没有真正的实例分离实例方法引用(编辑:Yet。请参阅 Wavyx 对此答案的评论。),所以你有用闭包伪造它。在 Java 8 中使用实例方法引用语法时,您实际上是在设置 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
转换为 [=14= 期望的 @FunctionalInterface
类型] 或 mapDate()
方法。
从 Groovy 3(测试版)开始,groovy 现在有 support for java 8 colon syntax (and more)。
因此您的示例在 groovy 中将完全相同。
Groovy 中的 Java 8 :: (double colon operator) 相当于什么?
我正在尝试将此示例翻译成 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);
}
Groovy 并没有真正的实例分离实例方法引用(编辑:Yet。请参阅 Wavyx 对此答案的评论。),所以你有用闭包伪造它。在 Java 8 中使用实例方法引用语法时,您实际上是在设置 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
转换为 [=14= 期望的 @FunctionalInterface
类型] 或 mapDate()
方法。
从 Groovy 3(测试版)开始,groovy 现在有 support for java 8 colon syntax (and more)。
因此您的示例在 groovy 中将完全相同。