Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy equivalent of Java 8 :: (double colon) operator

What would the equivalent to Java 8 :: (double colon operator) in Groovy?

I'm trying to translate this example in groovy https://github.com/bytefish/PgBulkInsert

But the mapping part doesn't work the same way as Java 8:

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

    mapString("first_name", Person::getFirstName);
    mapString("last_name", Person::getLastName);
    mapDate("birth_date", Person::getBirthDate);
}
like image 513
Wavyx Avatar asked Dec 30 '16 15:12

Wavyx


1 Answers

Groovy doesn't really have instance-divorced instance-method references (EDIT: Yet. See Wavyx's comment on this answer.), so instead you have to fake it with closures. When using instance-method reference syntax in Java 8, you are really setting up the equivalent of a lambda that expects the invoking instance as its first (in this case, only) argument.

Thus, to get the same effect in Groovy we have to create a closure that uses the default it argument as the invoking instance. Like this:

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

Notice the use of Groovy property notation here, and that it is necessary to cast the Closure to the @FunctionalInterface type expected by the mapString() or mapDate() method.

like image 167
BalRog Avatar answered Sep 29 '22 00:09

BalRog