写点什么

Groovy closure 与 Java function 转换

作者:FunTester
  • 2022 年 9 月 28 日
    北京
  • 本文字数:1283 字

    阅读完需:约 4 分钟

我在项目里面都是 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.Consumerimport java.util.function.Functionimport java.util.function.Predicateimport 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) } }}
复制代码


简单演示:


@Log4j2class 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 1018:53:04.673 main 2018:53:04.676 main 30
进程已结束,退出代码0
复制代码


发布于: 2 小时前阅读数: 8
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020.10.20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
Groovy closure 与Java function转换_FunTester_InfoQ写作社区