java - 在 Groovy 中发出 Java Lambda
问题描述
在开发与 Java 代码一起使用的 Groovy 库时,我希望能够使用 Java Lambdas 而不是 Groovy 特定的机制。
当从 Java 端访问这个库 API 时,用户不需要任何 Groovy 特定的导入或公开任何 Groovy 特定的功能。
特定于 Java 的 Lambda 可以传递给 API,并且特定于 Java 的 Lambda 也应该从 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 不会暴露给开发人员。
解决方案
简短的回答是您将能够像在 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");
})
推荐阅读
- python - 如何使用opencv python中的特征匹配在pcb中找到丢失的组件
- python - 无法使用 selenium 和 Python 将 PDF 从计算机上传到网络
- javascript - 在 Slick 滑块中单击时切换类
- c# - 抽象类继承属性始终为空
- sles - Chrony 设置中的时间未同步
- python - PyCharm:在区域上运行“black -S”
- javascript - 错误:拒绝获取不安全的标头“SourceMap”
- boost-asio - 在 Boost:asio 中,如何为任何特定活动保留一个线程
- mysql - 如何告诉gorm保存丢失的时间。时间字段为NULL而不是'0000-00-00'?
- python-3.x - 尝试使用 get-metric-statistics 从 Lambda 从 Cloudwatch 获取 CPU 利用率指标时响应为空