Groovy closure 与Java function转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Groovy closure 与Java function转换的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA 和 Gradle - 不能应用于“(groovy.lang.Closure)”

java8 还需要groovy,吗

Groovy闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

Groovy闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

Groovy闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )

Groovy闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )