在Clojure中如何像Java流中那样处理集合-逐一遍历所有函数,而不是评估所有堆栈框架中的所有元素。我也将其描述为Unix管道(下一个程序从上一个程序中逐块提取)。
答案 0 :(得分:2)
据我了解您的问题,您可能需要研究两件事。
首先,了解sequence abstraction。这是一种查看集合的方法,该集合一个个地消耗它们,并且懒惰。这是一个重要的Clojure习语,您将遇到众所周知的功能,例如map
,filter
,reduce
等。注释中已经提到的宏->>
也很重要。
此后,当您想更深入地研究时,您可能想要研究transducers和reducers。在一个过于简化的摘要中,它们使您可以将多个惰性函数组合为一个函数,然后以较低的惰性,较少的内存消耗,较高的性能,并且可能在多个线程上处理集合。不过,我认为这些是高级主题。也许序列已经是您想要的。
答案 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 CheatSheet或Clojure for the Brave and True。