【问题标题】:Kotlin. How to map only non null values of list?科特林。如何仅映射列表的非空值?
【发布时间】:2022-12-02 23:12:06
【问题描述】:

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

例如我有TestData的列表:

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

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

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

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

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

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

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

【问题讨论】:

    标签: kotlin arraylist collections kotlin-extension kotlin-null-safety


    【解决方案1】:

    您可以将mapNotNull 改为value,而不是filter。这基本上是一个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()
    

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多