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
相关产品推荐
相关产品推荐

