![](/img/trans.png)
[英]Are Clojure transducers the same concept as intermediate operations on streams in Java?
[英]Consuming Java streams in Clojure
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
?
您可以使用其iterator()方法从Stream中获取java.util.Iterator。 可以使用iterator-seq创建一个clojure序列:
(-> stream
.iterator
iterator-seq)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.