首页 > 解决方案 > 在 Clojure 中复制 Java peek 流方法

问题描述

在Java中我可以做到这一点

list.stream().peek(System.out::println).filter(i -> i >= 0).findFirst();

这将在列表中找到第一个正数,打印从开始到第一个正数的所有数字。

我在 Clojure 中需要类似的东西,但我找不到 peek 的等价物。peek 在 Clojure 中做了一些不同的事情。我需要在不消耗序列的情况下创建副作用,中介。就像元素通过一样,它们应该被传递给函数。我可以自己实现它,但我不想重新发明现有的东西。似乎是基本功能,我找不到要调用的正确函数)。

标签: clojurejava-streamseqpeek

解决方案


只需map与 和 转换器结合使用doto即可使其产生副作用,否则将成为直通:

(into []
 (comp
  (map #(doto % println))
  (filter pos?)
  (take 1))
 [-1 -2 -3 4 5])

或者对于您在评论中所说的话,您可以使用do例如:

(->>
 (repeatedly #(rand-nth [1 nil nil]))
 (into []
  (comp
   (map #(do (when (nil? %) (Thread/sleep 1000)) %))
   (remove nil?)
   (take 1)))
 first)

我正在使用传感器,因为由于分块,不能保证惰性序列一次只有一个,如果你想避免这种情况,需要特别小心,所以在你想要混合的情况下它会更好更容易在数据转换管道内的副作用中,改为使用转换器。


推荐阅读