Испускание Java лямбд в Groovy - PullRequest
0 голосов
/ 11 июля 2020

При разработке библиотеки Groovy, которая будет использоваться с кодом Java, я хочу иметь возможность использовать Java лямбда-выражения, чем Groovy определенные c механизмы.

При доступе к этой библиотеке API со стороны Java пользователь не должен нуждаться в импорте Groovy спецификаций c или предоставления каких-либо Groovy специфических функций.

Java -specifi c Lambdas могут быть переданы в API, а также Java -specifi c Lambdas должны быть возвращены из API.

Есть ли способ, которым это может быть достигнуто?

Например,

    def f() {
        return { n -> n + 1}
    }

Тип возврата f - groovy.lang.Closure. Я хочу, чтобы это было Function.

Кроме того, вместо

    def f(Closure c) {
        ...
        c.delegate = this
        c.resolveStrategy = DELEGATE_ONLY 
        ...
    }

я хочу заменить Closure c на Function.

При этом, когда при использовании со стороны Java Groovy функции и API не предоставляются разработчику.

1 Ответ

1 голос
/ 12 июля 2020

Короткий ответ заключается в том, что вы сможете сделать это так же, как в Java.

В java ламда принимается как объект, реализующий функциональный интерфейс - функциональный интерфейс является интерфейс, содержащий только один абстрактный метод, который соответствует сигнатуре передаваемой лямбды.

В качестве примера вы можете использовать интерфейс Runnable, который имеет только метод запуска без параметров.

В groovy вы примете объект типа Runnable:

def myGroovyFunction(Runnable r) {
    r.run()
}

Здесь вы можете использовать любой функциональный интерфейс, например что-то из java .util.function или ваш собственный интерфейс.

ваш код java теперь может передавать лямбду, например:

MyGroovyClass.myGroovyFunction(() -> {
    System.out.println("This will be printed by the groovy function");
})
...