在 Groovy 中发出 Java Lambda

Emitting Java Lambdas in Groovy

提问人:Suminda Sirinath S. Dharmasena 提问时间:7/11/2020 最后编辑:Suminda Sirinath S. Dharmasena 更新时间:7/13/2020 访问量:274

问:

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

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

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

有没有办法做到这一点?

例如

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

返回类型为 。我希望它是.fgroovy.lang.ClosureFunction

此外,而不是

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

我想用 替换为 .Closure cFunction

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

Java Groovy Lambda 闭包

评论

0赞 cfrick 7/11/2020
请添加您尝试过的代码以及它是如何失败的(例如错误、堆栈跟踪、日志等),以便我们改进它。
0赞 Suminda Sirinath S. Dharmasena 7/11/2020
我已经更新了它。看看现在是否可以。
0赞 cfrick 7/11/2020
您可以将闭包强制转换为函数。但请注意,在您的示例中,函数不再具有委托。所以你放弃了这个角度。

答:

1赞 Alterlife 7/13/2020 #1

简短的回答是,您将能够像在 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");
})