我想要一些东西来定义我的UDT,所以
(defrecord Foo [a b])
现在我可以将此类型的实例声明为
(def f (Foo. 10 20))
但是我如何在clojure中使用类似java的数组。
我希望new ArrayList<Foo>()
(或接近),以便我可以重复调用Add方法将新的Foo添加到列表中。
似乎无法找到办法。
编辑:
我需要告诉clojure将我的东西映射到Foo的键。所以,我需要一种方法来说明我的foo数据,然后创建一个类型为Foo的ArrayList
(defrecord Foo [a b c])
(def foo-data
[ "foo1" 1 8
"foo2" 2 7
"foo3" 3 6
"foo4" 4 5])
我可以通过doseq访问这些但是我需要创建一个ArrayList然后使用 要做一些操纵。
答案 0 :(得分:6)
我建议使用内置的Clojure功能,它自动创建一个构造函数:
(defrecord Foo [a b])
(->Foo 1 2) ;; auto-generated constructor
=> #user.Foo{:a 1, :b 2}
然后你可以使用标准的Clojure高阶函数来构造你喜欢的任何Foo
集合,例如。
(def foo-data [["Bob" 2]
["Fred" 4]
["Len" 6]])
(into [] (map (partial apply ->Foo) foo-data))
=> (A vector of Foos with the provided data)
答案 1 :(得分:3)
它将如此简单:
user=> (import 'java.util.ArrayList)
user=> (def data (ArrayList.))
#'user/data
user=> (.add data (Foo. 10 20))
我建议在这种情况下使用像矢量这样的clojure数据结构。
矢量示例:
user=> (def data (atom []))
#'user/data
user=> (swap! data conj (Foo. 10 20)) ;Add item to data vector
答案 2 :(得分:1)
如果您不需要将ArrayList传递回强力键入的内容,最好在Clojure中操作数据结构。我发现http://clojure.org/cheatsheet的“Seq In,Seq Out”部分是一个方便的参考。如果您希望通过示例学习,http://www.4clojure.com对于学习数据结构转换非常有用。