如何在Clojure中创建一个ArrayList

Alf*_*iao 5 java arraylist clojure

我需要在clojure中创建并填充ArrayList并将其传递给Java API.有人可以帮助解释为什么以下两种方法存在差异(以及为什么其中一种方法不起作用).

;;; this works
(defn make-an-array-list []
  (let [alist (java.util.ArrayList.)]
    (loop [x 0] (when (< x 6) (.add alist x) (recur (inc x)))) alist))
;;; ==> [0 1 2 3 4 5]

;;; this does not work
(defn make-an-array-list2 []
  (let [alist (java.util.ArrayList.)]
    (for [n (range 6)] (.add alist n)) alist))
;;; ==> []
Run Code Online (Sandbox Code Playgroud)

或者,是否有任何建议而不是上述方法?

ama*_*loy 16

更好的是,只需写(ArrayList. (range 6)).或者如果java代码写得很好,并且只需要Iterable,List或Collection - 比ArrayList更具特异性 - 你可以简单地返回(range 6).


eag*_*flo 5

使用doseq代替懒惰for。它具有for-like绑定,但它是副作用。

(defn make-an-array-list2 []
  (let [alist (java.util.ArrayList.)]
    (doseq [n (range 6)] (.add alist n)) alist))

;; [0 1 2 3 4 5]
Run Code Online (Sandbox Code Playgroud)