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

如何使用谓词列表对Kotlin集合执行多条件过滤操作

实现方案

方法1:使用fold(推荐,适配任意长度谓词列表,包括空列表)

fold的初始值设为原始列表,每一轮迭代都用当前谓词过滤上一轮得到的列表,正好符合按顺序应用所有谓词的需求,代码如下:

val filteredList = myPredicates.fold(myList) { currentList, predicate ->
    currentList.filter(predicate)
}

拿你给出的示例测试的话,执行逻辑是:

  1. 初始值为[1,2,3,4,5,6,7]
  2. 应用第一个谓词myInt > 1,得到[2,3,4,5,6,7]
  3. 应用第二个谓词myInt%2 == 0,最终得到[2,4,6],完全符合预期。

方法2:使用reduce(仅适用于非空谓词列表)

如果能保证谓词列表永远不为空,也可以用reduce实现,不过容错性比fold差,空列表会抛出异常:

val filteredList = myPredicates.reduce { acc, predicate ->
    { element -> acc(element) && predicate(element) }
}.let { combinedPredicate -> myList.filter(combinedPredicate) }

这个写法是先把所有谓词组合成一个"所有条件都满足"的复合谓词,再一次性过滤列表,结果和fold写法完全一致。

通用泛型扩展(可复用)

你可以把这个逻辑封装成泛型扩展函数,适配任意类型的列表和对应谓词:

fun <T> Iterable<T>.filterWithPredicates(predicates: List<(T) -> Boolean>): List<T> {
    return predicates.fold(this.toList()) { current, predicate -> current.filter(predicate) }
}

// 调用方式
val filteredList = myList.filterWithPredicates(myPredicates)

内容的提问来源于stack exchange,提问作者J-bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:51:00