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

Kotlin:过滤List空值时如何保留元素原索引?

Kotlin:过滤带空值列表并保留原索引

你当前使用的mapIndexedNotNull写法其实已经是Kotlin里最直接、最符合惯用风格的实现方式了:

foo.mapIndexedNotNull { index, v -> v?.let { index to v } }

为什么这个写法最优?

mapIndexedNotNull本身就是为「遍历元素时同时获取原索引,且自动过滤掉返回值为null的结果」这种场景设计的,它把索引绑定、空值过滤、结果转换三个逻辑合并在一个函数调用里,代码简洁且语义清晰。

其他等价但不更简洁的写法

如果想换一种表达方式,也可以用以下变体,但本质逻辑和你的写法一致,且代码量更多:

  1. 先生成带索引的包装对象,再过滤转换:
foo.mapIndexed { index, v -> IndexedValue(index, v) }
    .filter { it.value != null }
    .map { it.index to it.value!! }

这里的!!非空断言是安全的,因为已经通过filter确保了值不为空,但相比你的写法多了两步调用。

  1. 用序列优化大数据量场景:
foo.asSequence()
    .mapIndexed { index, v -> v?.let { index to it } }
    .filterNotNull()
    .toList()

这种写法在处理超大列表时可以避免中间列表的创建,但写法上并没有更简洁,只是性能优化方向的变体。

避坑提醒

不要尝试先过滤再获取索引(比如foo.filterNotNull().mapIndexed { ... }),这种方式会丢失原列表的索引,得到的是过滤后新列表的索引,不符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:05:11