扫码阅读
手机扫码阅读
Groovy closure 与Java function转换
81 2024-04-13
我在项目里面都是 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 function = new Function() { @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
原文链接:
http://mp.weixin.qq.com/s?__biz=MzU4MTE2NDEyMQ==&mid=2247498180&idx=1&sn=b04f3e0cbce44edfd7c1c86295bc209f&chksm=fd4974f2ca3efde45ab8896773ba4725373771d6347baaf0f91903a9d6e4140f6f58d67fd6ac#rd
FunTester的其他文章
应对自动化测试9大挑战
本文讨论了最常遇到的关键挑战,以及如何帮助简单地或自动地应对这些挑战。
从手动测试到自动化测试(上)
随着软件需求的变化比以往任何时候都更快更频繁,越来越多的团队正在采用敏捷方法来实现更短的开发周期和更快的迭代时间。
IntelliJ中基于文本的HTTP客户端
IntelliJ提供了一个纯基于文本的HTTP客户端。尽管一开始听起来可能很奇怪,但事实证明这是一个非常有用。
泛型类的正确用法
在准备下次直播Java基础的内容中,偶然看到Java泛型这个知识点,突然有了点想法,之前一直纠结的一个问题有了解答的思路。
i++需要多少QPS才能测出BUG
线程不安全需要多少 QPS 压测才能发现 BUG ?
加入社区微信群
与行业大咖零距离交流学习
软件研发质量管理体系建设
白皮书上线