2016-02-23 10 views
9

Java 8, Stream arabirimini getirdi ve Java koleksiyonlarında (ve akışa dönüştürülebilen diğer şeyler) uygun harita/filtre/azaltma işlemlerini getirdi.Clojure'da Java akışlarının tüketilmesi

Üretilen Java API'leriyle birlikte çalışırken, Clojure'dan kullanmak için akışları garip ve ayrıntılı olarak buluyorum.

karşılaştırın - Java:

Pattern.compile("\\s+").splitAsStream("one two three") 
     .filter(s -> !s.contains("o")) 
     .map(String::toUpperCase) 
     .findFirst() 
     .orElse(null); // => "THREE" 

Clojure, aynı API kullanmaya çalışıyor: Clojure içinde akış tabanlı Java API'leri tüketen için daha iyi bir yaklaşım

(.. (.splitAsStream #"\s+" "one two three") 
    (filter 
     (reify java.util.function.Predicate 
     (test [this value] (not (.contains value "o"))))) 
    (map 
     (reify java.util.function.Function 
     (apply [this value] (.toUpperCase value)))) 
    (findFirst) 
    (orElse nil)) ; => "THREE" 

var mı? Bir akışı bir sıraya dönüştürmek ve Clojure’ın remove, partition, take gibi kendi dönüştürme işlevlerini kullanmak mümkün mü?

cevap

20

Bir java.util.Iterator dosyasını, iterator() yöntemini kullanarak Akıştan alabilirsiniz. Bu, iterator-seq:

(-> stream 
    .iterator 
    iterator-seq) 
kullanılarak bir clojure dizisi yapılabilir.