在map函数中使用interop构造函数(Clojure)

时间:2014-02-27 03:37:51

标签: clojure

在将Integer构造函数传递给map函数时,我收到了这个抱怨:

=> (map Integer. ["1" "2" "3"])
CompilerException java.lang.ClassNotFoundException: Integer., compiling:(NO_SOURCE_PATH:1:1) 

然而,当我在一个函数中包装构造函数时,一切正常:

=> (defn str-to-int [str] (Integer. str))
=> (map str-to-int ["1" "2" "3"])
(1 2 3)

为什么我必须将Integer包装在另一个函数中才能使其工作?有没有更好的方法让它工作而不创造额外的功能?

2 个答案:

答案 0 :(得分:2)

map接收函数,interop使用像new这样的特殊形式。和.. 使用匿名函数文字

包装它们相当容易

例如

(map #(Integer. %) ["1" "2" "3"])

产生所需的结果。

答案 1 :(得分:1)

没有java互操作。如果你只需要转换为数字。

; nrepl.el 0.2.0 (Clojure 1.5.1, nREPL 0.2.3)
user> (map read-string ["1" "2"])
(1 2)
user> (class (first *1))
java.lang.Long

或者如果你真的需要Integer类

user> (map (comp int read-string) ["1" "2"])
(1 2)
user> (class (first *1))
java.lang.Integer