如何单次遍历集合,按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
相关产品推荐
相关产品推荐

