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

Kotlin中高效查找嵌套列表指定元素首次出现的索引

实现方案

你原有的flatMap实现存在两个明显缺陷:一是会全量遍历整个嵌套集合生成中间打平列表,无法提前终止遍历,性能损耗大;二是打平过程丢失了原始索引信息,无法拿到元素位置。
下面给出两种不同场景的高效实现:

场景1:需要获取外层ABC索引 + 内层XYZ索引

采用惰性序列实现,匹配到第一个元素就终止遍历,无额外集合创建开销:

data class MatchResult(
    val abcIndex: Int, // 对应ABC在根列表的索引
    val xyzIndex: Int, // 对应XYZ在ABC.value列表的索引
    val xyz: XYZ // 匹配到的XYZ对象
)

val result: MatchResult? = list?.asSequence()
    ?.mapIndexed { abcIndex, abc -> abcIndex to abc.value }
    ?.flatMap { (abcIndex, xyzList) ->
        xyzList.asSequence()
            .mapIndexed { xyzIndex, xyz -> 
                if (xyz?.isRead == false) MatchResult(abcIndex, xyzIndex, xyz) 
                else null 
            }
    }
    ?.filterNotNull()
    ?.firstOrNull()

场景2:只需要获取打平后的全局索引

采用命令式遍历实现,性能最优,完全无额外内存开销:

var globalIndex = 0
val result: Pair<Int, XYZ>? = list?.firstNotNullOfOrNull { abc ->
    abc.value.forEachIndexed { localIndex, xyz ->
        if (xyz?.isRead == false) {
            return@firstNotNullOfOrNull (globalIndex + localIndex) to xyz
        }
    }
    globalIndex += abc.value.size
    null
}

两种实现都只会遍历到第一个符合条件的元素就停止,相比你原有方案性能提升明显,嵌套层级越深、集合越大,优化效果越显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:54:02