Groovy closure 与Java function转换
我在项目里面都是 Java 和 Groovy 混这写,之前逻辑是框架和工具类用 Java,脚本用 Groovy。但是随着时间推移,Groovy相对 Java 的优势过于明显,搞得自己把自己搞混乱了。其中遇到了一些兼容性问题,典型的就是 Java 的 function 和 Groovy closure 之间的兼容性问题。
Java function 包里面很非常多实现类,其中主要区分的返回和参数个数,然后有很多具体返回和参数类型的实现类。总之就是比较多,实现逻辑倒是不复杂。
相比之下,Groovy closure 就非常简单,一个实现即可满足所有需求,相比 Java 的使用范围更广。
问题来了,两者不是完全相互兼容的,Java 和 Groovy 混编的时候经常遇到两者相互转换的问题,后来我更多使用 Groovy closure 来实现需求。为了提升效果节省时间,写了一个转换类,将 Java 的 function 转换成 closure。
package com.funtester.utils
import java.util.function.Consumer
import java.util.function.Function
import java.util.function.Predicate
import java.util.function.Supplier
/**
* 处理Java与Groovy不兼容的问题
**/
class JToG {
static Closure toClosure(Supplier supplier) {
return {
supplier.get()
}
}
static Closure toClosure(Function function) {
return {
def t -> function.apply(t)
}
}
static Closure toClosure(Predicate predicate) {
return {
def t -> predicate.test(t)
}
}
static Closure toClusure(Consumer consumer) {
return {
def t -> consumer.accept(t)
}
}
}
简单演示:
@Log4j2
class Ts extends FunHttp {
public static void main(String[] args) {
Function<Integer, Integer> function = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer * 10;
}
};
log.info(function.apply(1));
def closure = JToG.toClosure(function)
log.info(closure(2))
//Groovy 实现
def func = {int x ->
x * 10
}
log.info(func(3))
}
}
控制台输出:
18:53:04.211 main
###### # # # # ####### ###### ##### ####### ###### #####
# # # ## # # # # # # # #
#### # # # # # # #### ##### # #### #####
# # # # # # # # # # # # #
# ##### # # # ###### ##### # ###### # #
18:53:04.649 main 10
18:53:04.673 main 20
18:53:04.676 main 30
进程已结束,退出代码0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2021-09-28 卷王本卷
2020-09-28 自动化测试灵魂三问:是什么、为什么和做什么