繁体   English   中英

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

您可以使用其iterator()方法从Stream中获取java.util.Iterator。 可以使用iterator-seq创建一个clojure序列:

(-> stream
    .iterator
    iterator-seq)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM