我正在编写一个Java类(它是一个GUI小部件),它将在Clojure中使用。初始化Java类时,必须提供回调函数。当满足某些条件时,Java类将使用单个参数调用该函数。
我正在尝试找出应该在Java代码中声明回调函数的类型。
我知道Clojure函数实现了Runnable
和Callable
,但Runnables和Callables在调用时都不能接受参数。当然,Clojure函数也实现了IFn
,但我更喜欢使用标准的Java类型。有什么想法吗?
答案 0 :(得分:2)
我使用:
检查了Clojure函数实现的所有接口(ancestors (class (fn [a] a)))
得到了答案:
#{clojure.lang.AFunction java.lang.Object clojure.lang.Fn clojure.lang.IFn clojure.lang.IObj java.io.Serializable java.util.concurrent.Callable java.lang.Runnable java.util.Comparator clojure.lang.AFn clojure.lang.IMeta}
讨厌鬼!看起来我不会比使用IFn
做得更好。
奇怪的是,经过近20年的历史,Java平台没有类似lambda对象的标准类或接口!有ActionListeners
和此听众以及听众Runnable
和Callable
,但没有通用的“功能”对象。
答案 1 :(得分:-1)
我有类似的问题,然后为每个人创建了一个罐子
<dependency>
<groupId>com.incarcloud</groupId>
<artifactId>ac-func-tion</artifactId>
<version>1.1.0</version>
</dependency>
然后可以编写这样的代码:
import com.incarcloud.lang.*;
Action<Integer> actFoo = (x)->{ System.out.println(x); };
// you can call it directly
actFoo.run(5);
// or you can call it with a wrap
Runnable wrapFoo = new RunnableAction<>(actFoo, 5);
wrapFoo.run();
// or in a single line
(new RunnableAction<Integer>((x)->{ System.out.println(x); }, 5)).run();
总共有10个接口,最多可以接受5个参数。
Action<T> Action2<T1,T2> ... Action5<T1,T2,T3,T4,T5> these like Runnable without return value
Func<R,T> Func2<R,T1,T2> ... Func5<R,T1,T2,T3,T4,T5> these like Callable with return type R
每个都有包装类 RunnableAction,RunnableAction2 ...... CallableFunc,CallableFunc2 ......
和线程池包装类
Action2<Integer, Integer> action = (a, b)->{
System.out.println(String.format("Action(%d, %d)", a, b));
};
ExecutorForAcFunction pool = new ExecutorForAcFunction(Executors.newFixedThreadPool(2));
for(int i=0;i<5;i++){
pool.submit(action, i, 10-i);
}
可在此处找到更多信息 https://github.com/InCar/ac-func-tion