Clojure管道一一收集

时间:2018-10-17 11:05:04

标签: clojure

在Clojure中如何像Java流中那样处理集合-逐一遍历所有函数,而不是评估所有堆栈框架中的所有元素。我也将其描述为Unix管道(下一个程序从上一个程序中逐块提取)。

2 个答案:

答案 0 :(得分:2)

据我了解您的问题,您可能需要研究两件事。

首先,了解sequence abstraction。这是一种查看集合的方法,该集合一个个地消耗它们,并且懒惰。这是一个重要的Clojure习语,您将遇到众所周知的功能,例如mapfilterreduce等。注释中已经提到的宏->>也很重要。

此后,当您想更深入地研究时,您可能想要研究transducersreducers。在一个过于简化的摘要中,它们使您可以将多个惰性函数组合为一个函数,然后以较低的惰性,较少的内存消耗,较高的性能,并且可能在多个线程上处理集合。不过,我认为这些是高级主题。也许序列已经是您想要的。

答案 1 :(得分:0)

这是一个简单的示例from ClojureDocs.org

;; Use of `->` (the "thread-first" macro) can help make code
;; more readable by removing nesting. It can be especially
;; useful when using host methods:

;; Arguably a bit cumbersome to read:
user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))
"X"

;; Perhaps easier to read:
user=> (-> "a b c d" 
           .toUpperCase 
           (.replace "A" "X") 
           (.split " ") 
           first)
"X"

一如既往,不要忘记the Clojure CheatSheetClojure for the Brave and True