Java 8中双冒号运算符的Groovy等效方式

18

Java 8中的::(双冒号运算符)在Groovy中有什么等效物?

我正在尝试将这个例子翻译成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);
}

2
似乎Groovy方法指针运算符.&很接近,但需要一个声明类的实例。 - M A
实际上,我需要为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到Functional接口符号高效,但我认为它会起到相同的作用。 - BalRog
@BalRog 非常感谢,它起作用了 ;) 你应该提交一个答案。我期望Groovy有一种方法来利用Lambda函数接口。顺便说一下,代码可在https://github.com/bytefish/PgBulkInsert/blob/master/PgBulkInsert/src/main/java/de/bytefish/pgbulkinsert/PgBulkInsert.java#L168上找到。 - Wavyx
我已经按照你的要求完成了。 - BalRog
2个回答

15

Groovy目前还没有实例分离的实例方法引用(编辑:,请参见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强制转换为@FunctionalInterface类型,以符合mapString()mapDate()方法所期望的类型。


4
Java 8 中的双冒号符号将在2017年被添加。 - Wavyx
1
这个发布了吗? - Dan Tuffery
没什么主意。你可以尝试在推特上@“glaforge”以获取更新(请参见Wavyx评论中的链接)。我听说他非常负责任。 - BalRog
3
目前(2.6.0-alpha-2),无法工作。但有人知道这将被添加到Groovy 2还是Groovy 3中吗?目前被描述为“Bleeding Edge”(http://groovy-lang.org/download.html)。 - mike rodent

6
截至Groovy 3(beta)版本,Groovy现在支持Java 8冒号语法(更多)。所以你所拥有的示例在Groovy中将以完全相同的方式工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接