【发布时间】:2021-01-20 07:46:59
【问题描述】:
在 Java 中我可以做到这一点
list.stream().peek(System.out::println).filter(i -> i >= 0).findFirst();
这将找到列表中的第一个正数,打印从开始到第一个正数的所有数字。
我在 Clojure 中需要类似的东西,但我找不到 peek 的等价物。 peek 在 Clojure 中做了一些不同的事情。我需要在不消耗序列的情况下创建副作用,中介。就像元素通过一样,它们应该被传递给函数。 我可以自己实现它,但我不想重新发明现有的东西。似乎是基本功能,我找不到要调用的正确函数。
【问题讨论】:
-
你可以编一些函数来达到效果,像这样:
(defn effect [f] (fn [x] (f x) x))。然后以这种方式使用它:(first (drop-while (comp neg? (effect println)) (range -10 10)))。但是这里有一个陷阱:在某些情况下,clojure 优化了序列的消耗,通过块来实现它们。所以(first (filter (comp pos? (effect println)) (range -10 10)))会给你比你预期更多的输出。只要您使用 take-while / drop-while 就可以了,但是 filter / map 和其他需要一些去块代码以确保不会发生意外的副作用。
标签: clojure java-stream seq peek