Ci sono un sacco di opzioni, dal momento che Clojure gioca molto bene con collezioni di Java. Dipende esattamente da quale struttura dati si desidera utilizzare in Clojure.
Ecco alcuni esempi:
;; 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
Per quanto riguarda quando utilizzare ciascuna di queste, suggerirei il seguente consiglio:
- Se si sta tentando di avvolgere una libreria Java e presentare un pulito Clojure API, quindi suggerirei di convertire le strutture di dati Clojure equivalenti. Questo è ciò che gli utenti Clojure si aspettano, e puoi nascondere i dettagli dell'interop di Java potenzialmente disordinati. Come bonus, questo renderà le cose immutabili in modo da non correre il rischio che le collezioni Java si mutino mentre le usi.
- Se si desidera utilizzare l'API Java in modo rapido ed efficiente, è sufficiente utilizzare l'interoperabilità Java direttamente nelle raccolte Java.