有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Clojure中使用Java流

Java8带来了^{}接口,并通过它方便地对Java集合(以及其他可以转化为流的东西)进行映射/过滤/减少操作

我发现Clojure在与生成流的Java API进行互操作时使用流既笨拙又冗长

比较——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) 个答案

  1. # 1 楼答案

    你可以得到一个java。util。使用迭代器()方法从流中提取迭代器。可以使用迭代器seq生成clojure序列:

    (-> stream
        .iterator
        iterator-seq)