You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何单次遍历集合,按filter-func将元素分为truthys和falsys集合?

一次遍历拆分集合为符合/不符合条件的两个子集

当然可以,你可以通过以下两种常见方式实现仅一次遍历集合,同时每个元素仅执行一次filter-func,就能拆分出truthys和falsys:

方法一:使用group-by

group-by会遍历集合一次,对每个元素调用一次指定函数,再按函数返回值分组:

(let [groups (group-by filter-func coll)
      truthys (groups true)
      falsys (groups false)]
  ; 这里编写后续使用truthys和falsys的逻辑
  )

注:如果filter-func可能返回非布尔值,需要先确保它的返回值只会是true或false,否则分组结果会包含其他键。

方法二:使用reduce手动聚合

通过reduce遍历集合,逐个判断元素并添加到对应的子集中:

(let [[truthys falsys]
      (reduce (fn [[true-list false-list] elem]
                (if (filter-func elem)
                  [(conj true-list elem) false-list]
                  [true-list (conj false-list elem)]))
              [[] []]  ; 初始值:两个空集合
              coll)]
  ; 后续逻辑
  )

这两种方法都能避免原代码中两次遍历集合、重复执行filter-func的问题,效率更高。

内容的提问来源于stack exchange,提问作者user1785730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:20:55