如何在 Clojure 中使用 java 方法作为函数参数?
例如,我想做一个函数组合:
user> (Integer. (str \9))
9
user> ((comp Integer. str) \9)
CompilerException java.lang.ClassNotFoundException: Integer., compiling:(NO_SOURCE_PATH:1:2)
Run Code Online (Sandbox Code Playgroud)
那是行不通的。
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)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
相关问题(但没有给出问题的正确答案):
(注意:戴夫建议的答案,使用匿名函数作为包装器,似乎是最好的解决方案)
与 Clojure 函数不同,Java 方法并不是被设计为一流的。当您在 Clojure 中使用 Java 互操作时,您实际上是在使用 Java 方法,因此您无法获得为 Clojure 函数实现的额外好处。欲了解更多信息,请参阅下面的评论。
作为使用 Java 方法作为参数的解决方法,您可以将它们包装在匿名函数中,如下所示,有效地使它们成为 Clojure 函数:
((comp #(Integer. %) str) \9)
Run Code Online (Sandbox Code Playgroud)