在Clojure中使用Java流

时间:2016-02-23 09:53:49

标签: java clojure java-8 java-stream

Java 8带来了Stream接口,并且可以方便地对Java集合(以及可以转换为流的其他东西)进行map / filter / reduce操作。

在与生成它们的Java API进行互操作时,我发现在Clojure中使用的流程很笨拙且冗长。

比较 - Java:

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

Clojure,尝试使用相同的API:

(.. (.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并使用Clojure自己的转换函数,如removepartitiontake

1 个答案:

答案 0 :(得分:22)

您可以使用iterator()方法从Stream中获取java.util.Iterator。可以使用iterator-seq:

制作一个clojure序列
List<string> strings = new List<string>() { var1, var2, var3,var4,var5,var6 };

bool hasDupes = strings.Count != (new HashSet<string>(strings)).Count;