如何在Clojure中找到满足给定谓词的序列的最后一个元素?

时间:2017-03-05 19:09:58

标签: clojure

我试图在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)的小堆增长。

1 个答案:

答案 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步骤将永远不会终止。那是另一个问题!