科特林。如何仅映射列表的非空值?

tes*_*van 0 collections arraylist kotlin kotlin-extension kotlin-null-safety

我需要对我的列表进行一些操作。

例如我有以下列表TestData

data class TestData (
    val value: Int?,
    val name: String
)
Run Code Online (Sandbox Code Playgroud)

我需要将列表映射TestData到列表String。这是我的代码:

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

问题是该函数getName(value: Int)仅接受不可为 null 的类型。我可以以某种方式跳过 null 的元素listOfTestDatavalue

我可以在制作地图之前过滤这些值,但我必须在地图内部使用!!,我想要一个更优雅的解决方案。

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

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

Swe*_*per 5

filter您可以改为mapNotNulls value。这基本上是 a map,但如果您提供的映射函数返回null,则该元素将被过滤掉。

listOfTestData.mapNotNull { it.value }
    .map { getName(it) }
    .distinct()
Run Code Online (Sandbox Code Playgroud)

这将重复列表 3 次。您可以通过在 上使用 a 来组合mapNotNull和:map?.letvalue

listOfTestData.mapNotNull { data -> data.value?.let { getName(it) } }.distinct()
Run Code Online (Sandbox Code Playgroud)

或者,使用序列:

listOfTestData.asSequence()
    .mapNotNull { it.value }
    .map { getName(it) }
    .distinct()
    .toList()
Run Code Online (Sandbox Code Playgroud)