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

Что было бы эквивалентно Java 8 :: (оператор двойного двоеточия) в Отличный?

Я пытаюсь перевести этот пример на 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);
}

person Wavyx    schedule 30.12.2016    source источник
comment
Кажется, оператор указателя метода Groovy .& близок, но ожидает экземпляр объявляющего класса.   -  person M A    schedule 30.12.2016
comment
Действительно, мне нужен функциональный интерфейс для класса Groovy. docs.oracle.com/javase/ 8/docs/api/java/util/функция/   -  person Wavyx    schedule 30.12.2016
comment
Трудно сказать, не видя кода ваших методов mapString() и mapDate(), но, возможно, что-то вроде этого сработает: mapString("first_name", { it.firstName } as Function). Это не так эффективно, как нотация «указатель функции на лямбда-на-функциональный интерфейс» в java 8, но я думаю, что она будет работать так же.   -  person BalRog    schedule 30.12.2016
comment
@BalRog Большое спасибо, это работает;) Вы должны отправить ответ. Я ожидал, что Groovy сможет использовать функциональные интерфейсы Lambda. Кстати, код доступен на github.com/bytefish/PgBulkInsert/blob/master/PgBulkInsert/src/   -  person Wavyx    schedule 30.12.2016
comment
Я сделал, как вы просили   -  person BalRog    schedule 31.12.2016


Ответы (2)


В 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().

person BalRog    schedule 30.12.2016
comment
Java 8 :: (двойное двоеточие) будет добавлена ​​в 2017 г. а> - person Wavyx; 02.01.2017
comment
Это выпустили? - person Dan Tuffery; 24.11.2017
comment
Без понятия. Вы можете попробовать твитнуть glaforge для обновления (см. ссылку в комментарии Wavyx). Я слышал, он довольно отзывчив. - person BalRog; 28.11.2017
comment
На данный момент (2.6.0-alpha-2) не работает. Но кто-нибудь знает, будет ли это добавлено в Groovy 2 или Groovy 3, в настоящее время описываемое как передовой (groovy- lang.org/download.html)? - person mike rodent; 02.03.2018

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

Так что пример, который у вас есть, будет работать точно так же в groovy.

person smac89    schedule 23.07.2019