我试图在Clojure中找到满足给定谓词的最后一个序列元素。
我现在使用以下代码:
(last (take-while pred (gimme-potentially-infinite-seq ...)))
不幸的是,(take-while ...)
占据了头部,在某些情况下导致我内存不足。
我可以使用loop/if/recur
组合来解决这个问题,但也许clojure.core中有一些函数(或函数组合)可以解决这个问题吗?
更新:它不是take-while
而是last
。
更新2:我在Clojure REPL和ClojureScript REPL(Planck 2.0.0和Lumo 1.1.0)中测试了这个(->> (range) (take 10000000) last)
。普朗克(2 GB RAM)和Lumo(1.5 GB)的主要堆增长,而JVM(200-300 MB)的小堆增长。
答案 0 :(得分:1)
慢慢建立它:
(def data (range 9999))
(defn is-evil? [x]
(= 666 (mod x 1000))) ; is the number like xxxx666
(def all-matching-nums
(filter is-evil? data))
all-matching-nums => (666 1666 2666 3666 4666 5666 6666 7666 8666 9666)
(last all-matching-nums) => 9666
当然,如果您的序列真正无限,filter
步骤将永远不会终止。那是另一个问题!