Kotlin嵌套列表遍历无法返回全部匹配值如何高效解决?
问题原因
原代码使用find函数匹配元素,该函数仅返回集合中第一个符合条件的元素,因此每个Group的value列表中只会取第一个未读的GroupValue,导致遗漏同分组内后续符合条件的条目。
最优实现方案
时间复杂度为O(N)(N为所有Group包含的GroupValue总个数),使用Kotlin惰性序列操作避免生成中间集合,大数量场景下性能表现最优:
fun main() { val value = listOf( Group(0, mutableListOf(GroupValue(true, "1"))), Group(1, mutableListOf(GroupValue(true, "2"))), Group(2, mutableListOf(GroupValue(false, "3"))), Group(3, mutableListOf(GroupValue(true, "4"))), Group(4, mutableListOf(GroupValue(false, "5"))), Group(5, mutableListOf(GroupValue(true, "6"))), Group(6, mutableListOf(GroupValue(true, "7"), GroupValue(false, "8"))), Group(7, mutableListOf(GroupValue(true, "9"), GroupValue(false, "10"))), Group(8, mutableListOf(GroupValue(false, "11"), GroupValue(false, "12"), GroupValue(false, "13"))), Group(9, mutableListOf(GroupValue(false, "14"), GroupValue(true, "15"))), Group(10, mutableListOf(GroupValue(true, "16"))) ) val list = value.slice(2..9) list.asSequence() // 展开所有分组下的GroupValue元素 .flatMap { it.value } // 过滤未读且非空的元素 .filter { it?.isRead == false } // 输出结果,也可替换为toList()收集结果 .forEach { println(it) } }
小数据量极简修改方案
如果数据量很小不需要考虑性能开销,直接修改原遍历逻辑即可:
list.forEach { messageGroup -> // 把find替换为filter,过滤当前分组所有符合条件的元素后遍历输出 messageGroup.value.filter { it?.isRead == false }.forEach { println(it) } }
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

