天天看點

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

           

繼續閱讀