2012-02-14 10 views
5

Java API'sine bir java.util.LinkedHashSet döndüren bir yöntemle Clojure arabirimi oluşturuyorum.Java koleksiyonlarını Clojure veri yapılarına dönüştürme

İlk olarak, LinkedHashSet'i bir clojure veri yapısına dönüştürmek için bunu ele alan deyimsel Clojure yolu nedir?

İkincisi, Java koleksiyonlarını Clojure veri yapılarına dönüştürmek için en iyi yöntem hangisidir?

cevap

12

, pek çok seçenek vardır. Clojure'da kullanmak istediğiniz veri yapısına tam olarak bağlıdır. Eğer bir Java kütüphanesi sarın ve temiz sunmaya çalışıyorsanız

  • : Burada

    bazı örnekler verilmiştir: Bunların her ne zaman kullanacağınıza ilişkin

    ;; 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 
    

    , şu tavsiyelerde öneririm Clojure API, o zaman eşdeğer Clojure veri yapılarına dönüştürmeyi öneririm. Clojure kullanıcılarının bekleyeceği şey budur ve potansiyel olarak karmaşık Java interop ayrıntılarını gizleyebilirsiniz. Bir ikramiye olarak, bu, bunları kullandığınızda mutasyona uğrayan Java koleksiyonlarının riskini çalıştırmamak için değişmez hale getirir.

  • Java API'sini hızlı ve verimli bir şekilde kullanmak istiyorsanız, Java koleksiyonlarında doğrudan Java etkileşimini kullanın.
2

Java koleksiyonlarını clojure'a dönüştürmenin deyimsel yolu, sekanslarda çalışan çoğu işlev tarafından zaten çağrılan (seq) işlevini kullanmaktır.

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

Ben evrensel kabul gören bir uygulama olmadığını gerçekten bilmiyorum, ancak orijinal Java API ile uyumluluk kırmaya burada Clojure adaptörleri Java karşı Chris Houser arguing bu.

İstediğin çeviri gerçekleştirmek için, sadece into kullanın: Clojure Java koleksiyonları ile çok güzel oynuyor beri

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"}