首页 > 解决方案 > 在 Groovy 中发出 Java Lambda

问题描述

在开发与 Java 代码一起使用的 Groovy 库时,我希望能够使用 Java Lambdas 而不是 Groovy 特定的机制。

当从 Java 端访问这个库 API 时,用户不需要任何 Groovy 特定的导入或公开任何 Groovy 特定的功能。

特定于 Java 的 Lambda 可以传递给 API,并且特定于 Java 的 Lambda 也应该从 API 返回。

有没有办法可以做到这一点?

例如

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

的返回类型fgroovy.lang.Closure。我希望它是Function

此外,而不是

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

我想替换Closure cFunction.

在这样做时,从 Java 端使用它时,Groovy 特性和 API 不会暴露给开发人员。

标签: javagroovylambdaclosures

解决方案


简短的回答是您将能够像在 Java 中一样执行此操作。

在 java 中,lamda 被接受为实现功能接口的对象 - 功能接口是一个仅包含一个抽象方法的接口,该方法与您将传入的 lambda 的签名相匹配。

例如,您可以使用 Runnable 接口,它只有一个没有参数的 run 方法。

在 groovy 中,您将接受 Runnable 类型的对象:

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

您可以在此处使用任何功能接口,例如 java.util.function 或您自己的接口。

你的java代码现在可以像这样传入一个lambda:

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

推荐阅读