我在項目裡面都是 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