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

Kotlin如何仅映射列表非空值?避免使用!!操作符

解决方案

方案1:用mapNotNull实现(最简洁)

mapNotNull会自动过滤映射后返回null的元素,结合安全调用和let,完全不需要!!:

val names = listOfTestData
    .mapNotNull { data -> data.value?.let { getName(it) } }
    .distinct()
  • 当data.value不为null时,?.let会把非空的Int传给getName,返回对应的字符串
  • 若data.value是null,整个表达式返回null,mapNotNull直接跳过这个元素

方案2:借助Kotlin智能转换(可读性拉满)

只要用filter过滤掉value为null的元素,后续map时编译器会自动把value推断为非空类型:

val names = listOfTestData
    .filter { it.value != null }
    .map { getName(it.value) } // 这里编译器已经知道it.value不可能为null
    .distinct()

Kotlin的智能转换会跟踪filter的条件,确认过滤后的元素value一定是非空的,所以直接用就行,不用加任何断言。

方案3:用flatMap处理(适合复杂场景)

如果之后需要扩展元素的展开逻辑,flatMap也是个不错的选择:

val names = listOfTestData
    .flatMap { data -> 
        data.value?.let { listOf(getName(it)) } ?: emptyList() 
    }
    .distinct()
  • value非空时,返回包含映射结果的单元素列表
  • value为空时返回空列表,flatMap会自动忽略空列表,最终只保留有效结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:20:28