Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否适合采用参数的Clojure函数的Java类型?_Java_Clojure - Fatal编程技术网

是否适合采用参数的Clojure函数的Java类型?

是否适合采用参数的Clojure函数的Java类型?,java,clojure,Java,Clojure,我正在编写一个Java类(它是一个GUI小部件),将在Clojure中使用。初始化Java类时,必须为其提供回调函数。当满足某些条件时,Java类将使用单个参数调用函数 我试图找出回调函数应该在Java代码中声明的类型 我知道Clojure函数实现了Runnable和Callable,但在调用时,Runnable和Callables都不能接受参数。当然,Clojure函数也实现IFn,但我更喜欢使用标准Java类型。有什么想法吗?我使用以下方法检查了Clojure函数实现的所有接口: (ance

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

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


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

我使用以下方法检查了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
,但没有通用的“函数”对象。

我有类似的问题,然后为每个人创建了一个jar

<dependency>
    <groupId>com.incarcloud</groupId>
    <artifactId>ac-func-tion</artifactId>
    <version>1.1.0</version>
</dependency>

com.cloud

“奇怪的是,在经历了近20年的历史之后,Java平台没有针对类似lambda的对象的标准类或接口!”很快,它就会有了:)JDK8包含大量功能接口,包括
函数
消费者
。我不知道Clojure是否会利用它……太棒了,我期待在混合Clojure/Java时使用它们。我能想到的Clojure人不利用这些功能的唯一原因是保持与旧JRE的兼容性。
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();
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
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);
}