2016-02-23 10 views
9

Java 8はStreamインターフェイスを持ち、Javaコレクション(およびストリームに変換できるその他のもの)の操作に便利なmap/filter/reduce操作を提供します。ClojureでJavaストリームを使用する

ストリームを生成するJava APIと相互運用するには、Clojureから使用するのが厄介で冗長なストリームがあります。

は比較 - Javaの:同じAPIを使用しようと

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

Clojureの、:

(.. (.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" 

はClojureの中で、ストリームベースのJavaのAPIを消費するより良い方法はありますか?ストリームをseqに変換し、removepartitiontakeのようなClojure独自の変換関数を使用することは可能ですか?

答えて

20

iterator()メソッドを使用してStreamからjava.util.Iteratorを取得できます。それはイテレータseqを使用してクロージャシーケンスにすることができます:

(-> stream 
    .iterator 
    iterator-seq) 
関連する問題