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

