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

