Groovy эквивалент оператора Java 8:: (двойной двоеточие)

Что эквивалентно Java 8:: (double colon operator) в 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);
}

Ответ 1

Groovy на самом деле не имеет ссылок на экземпляр-метод с разнесением экземпляра (EDIT: Пока. См. комментарий Wavyx на этот ответ.), поэтому вместо этого вы должны подделать его с помощью закрытий. При использовании ссылочного синтаксиса метода экземпляра в Java 8 вы действительно настраиваете эквивалент лямбда, который ожидает, что вызывающий экземпляр будет первым (в данном случае, только) аргументом.

Таким образом, чтобы получить тот же эффект в 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().

Ответ 2

Начиная с Groovy 3 (бета), у groovy теперь есть поддержка для синтаксиса двоеточия java 8 (и более).

Таким образом, ваш пример будет работать точно так же в Groovy.