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

Kotlin中filter与filterNot的差异及使用误区排查

问题分析与解决

核心原因:逻辑转换错误(德摩根定律误用)

原filter的逻辑是仅保留name和summary都非空/非空白的条目,对应的条件:

!it.name.isNullOrEmpty() && !it.summary.isNullOrEmpty()

当你替换为filterNot时,错误地将过滤条件写成了it.name.isNullOrEmpty() && it.summary.isNullOrEmpty(),这意味着仅排除name和summary同时为空的条目。而像你测试用的MovieDetails(summary = "name")(name为null,summary非空)这类条目,并不满足“两者同时为空”的排除条件,所以会被保留下来,最终得到不符合预期的结果。

正确的filterNot写法

根据德摩根定律,原条件!A && !B等价于!(A || B),因此对应的filterNot写法应该是:

filterNot { it.name.isNullOrEmpty() || it.summary.isNullOrEmpty() }

这个逻辑会排除所有name为空/空白,或者summary为空/空白的条目,和原filter的筛选效果完全一致。

验证测试

用你的测试数据MovieDetails(summary = "name")代入正确条件:
it.name.isNullOrEmpty() || it.summary.isNullOrEmpty() → true || false → true,filterNot会排除该条目,最终返回空列表,符合预期。

额外提示

如果需要同时排除空白字符串(比如全空格的" "),可以将isNullOrEmpty()替换为isNullOrBlank()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:02