将Java集合转换为Clojure数据结构

Tob*_*ede 5 java collections idioms clojure java-interop

我正在使用返回java.util.LinkedHashSet的方法创建Java API的Clojure接口.

首先,处理此问题的惯用Clojure方法是将LinkedHashSet转换为clojure数据结构吗?

其次,将Java集合转换为Clojure数据结构的最佳方法是什么?

mik*_*era 12

有很多选项,因为Clojure与Java集合非常相似.它取决于您想要在Clojure中使用的数据结构.

以下是一些例子:

;; create a HashSet
(def a (java.util.HashSet.))
(dotimes [i 10] (.add a i))

;; Get all the values as a sequence 
(seq a)
=> (0 1 2 3 4 5 6 7 8 9)

;; build a new HashSet containing the values from a 
(into #{} a)
#{0 1 2 3 4 5 6 7 8 9}

;; Just use the HashSet directly (high performance, no copy required)
(.contains a 1)
=> true
(.contains a 100)
=> false
Run Code Online (Sandbox Code Playgroud)

关于何时使用这些,我建议以下建议:

  • 如果您正在尝试打包Java库并提供一个干净的Clojure API,那么我建议转换为等效的Clojure数据结构.这就是Clojure用户期望的,您可以隐藏可能混乱的Java互操作细节.作为奖励,这将使事情变得不可变,这样您就不会冒着Java集合在使用它们时发生变异的风险.
  • 如果您只想快速有效地使用Java API,只需直接在Java集合上使用Java interop即可.