簡體   English   中英

將Java集合轉換為Clojure數據結構

[英]Converting Java collections to Clojure data structures

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

首先,處理此問題的慣用Clojure方法是將LinkedHashSet轉換為clojure數據結構嗎?

其次,將Java集合轉換為Clojure數據結構的最佳方法是什么?

有很多選項,因為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

關於何時使用這些,我建議以下建議:

  • 如果您正在嘗試打包Java庫並提供一個干凈的Clojure API,那么我建議轉換為等效的Clojure數據結構。 這就是Clojure用戶期望的,您可以隱藏可能混亂的Java互操作細節。 作為獎勵,這將使事情變得不可變,這樣您就不會冒着Java集合在使用它們時發生變異的風險。
  • 如果您只想快速有效地使用Java API,只需直接在Java集合上使用Java interop即可。

將java集合轉換為clojure的慣用方法是使用(seq)函數,該函數已經被大多數在序列上運行的函數調用。

(def s (java.util.LinkedHashSet.))
#'user/s
user> (seq s)
nil
user> (.add s "foo")
true
user> (seq s)
("foo")
user> 

老實說,我不知道是否有一個普遍接受的做法,但這里的克里斯·豪澤主張對Java來Clojure的適配器為你打破與原始的Java API的兼容性。

要執行你要的翻譯,只需使用

user=> (import java.util.LinkedHashSet)
java.util.LinkedHashSet
user=> (def x (LinkedHashSet.))
#'user/x
user=> (.add x "test")
true
user=> (def y (into #{} x))
#'user/y
user=> y
#{"test"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM