kotlin 如何只Map列表的非空值?

xxslljrj  于 2022-12-04  发布在  Kotlin
关注(0)|答案(1)|浏览(175)

我需要对我的列表进行一些操作。
例如,我有TestData的列表:

data class TestData (
    val value: Int?,
    val name: String
)

我需要将TestData的列表Map到String的列表。

val names = listOfTestData
              .map { data -> getName(data.value) } <- Type mismatch. Required: Int, found Int?
              .distinct()

问题是函数getName(value: Int)只接受一个不可空的类型,我能跳过listOfTestDatavalue为空的元素吗?
我可以在绘制Map之前过滤这些值,但是我必须在Map内部使用!!,我想要一个更优雅的解决方案。

val names = listOfTestData
                  .filter { it.value != null }
                  .map { data -> getName(data.value!!) } 
                  .distinct()

请告诉我如何在不使用!!的情况下完成此操作

e4yzc0pl

e4yzc0pl1#

您可以将mapNotNull转换为value,而不是filter。这基本上是一个map,但如果您提供的Map函数返回null,则该元素将被过滤掉。

listOfTestData.mapNotNull { it.value }
    .map { getName(it) }
    .distinct()

这将遍历列表3次。您可以通过在value上使用?.let来合并mapNotNullmap

listOfTestData.mapNotNull { data -> data.value?.let { getName(it) } }.distinct()

或者,使用序列:

listOfTestData.asSequence()
    .mapNotNull { it.value }
    .map { getName(it) }
    .distinct()
    .toList()

相关问题