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自己的转换函数,如remove
,partition
,take
?
答案 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;