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).
使用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)
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |