在Clojure中使用Java流
Java8带来了^{
我发现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自己的转换函数,如remove
、partition
、take
# 1 楼答案
你可以得到一个java。util。使用迭代器()方法从流中提取迭代器。可以使用迭代器seq生成clojure序列: