如何在Clojure中使用java方法作为函数参数?
例如,我想制作一个函数组合:
user> (Integer. (str \9))
9
user> ((comp Integer. str) \9)
CompilerException java.lang.ClassNotFoundException: Integer., compiling:(NO_SOURCE_PATH:1:2)
这不起作用。
memfn
也无济于事:
user> (map (comp (memfn Integer.) str) "891")
IllegalArgumentException No matching method found: Integer. for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
有什么想法吗?
相关问题(虽然没有给出正确答案):
(注意:似乎是dave建议的答案,使用匿名函数作为包装器,是最好的解决方案)
答案 0 :(得分:4)
与Clojure函数不同,Java方法并非设计为第一类。当您在Clojure中使用Java inter-op时,您实际上正在使用Java方法,因此您无法获得为Clojure函数实现的额外好处。有关详细信息,请参阅以下评论。
作为使用Java方法作为参数的解决方法,您可以将它们包装在匿名函数中,就像这样,有效地使它们成为Clojure函数:
((comp #(Integer. %) str) \9)