适合带有参数的Clojure函数的Java类型?

时间:2014-01-11 15:12:06

标签: java clojure

我正在编写一个Java类(它是一个GUI小部件),它将在Clojure中使用。初始化Java类时,必须提供回调函数。当满足某些条件时,Java类将使用单个参数调用该函数。

我正在尝试找出应该在Java代码中声明回调函数的类型。

我知道Clojure函数实现了RunnableCallable,但Runnables和Callables在调用时都不能接受参数。当然,Clojure函数也实现了IFn,但我更喜欢使用标准的Java类型。有什么想法吗?

2 个答案:

答案 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和此听众以及听众RunnableCallable,但没有通用的“功能”对象。

答案 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