gpt4 book ai didi

kotlin - 相当于 `mapNotNull` 的结果是什么?

转载 作者:行者123 更新时间:2023-12-02 13:08:38 32 4
gpt4 key购买 nike

我可以转换List<Int?>List<Int>使用mapNotNull功能如下图。

    @Test
fun main() {
val testData = listOf(1, null, 3, null)
val noNull = processAwayNull(testData)
}

private fun processAwayNull(testData: List<Int?>): List<Int> {
return testData.mapNotNull{ it }
}

如何转换 Map<String, Int?>Map<String, Int> ?下面是testData.filter { it.value != null }不起作用,因为它仍然产生 Map<String, Int?> .

    @Test
fun main() {
val testData = mapOf("One" to 1, "Two" to null, "Three" to 3, "Four" to null)
val noNull = processAwayNull(testData)
}

private fun processAwayNull(testData: Map<String, Int?>): Map<String, Int> {
return testData.filter { it.value != null }
}

最佳答案

好吧,并不是真正开箱即用(从某种意义上说,您立即得到 Map<String, Int> ),但是 filterValues 怎么样? ?

testData.filterValues { it != null } // gives Map<String, Int?> but without null-values

将其组合或替换为 mapValues (也许您可以使用默认值而不是 null ?):

// combining:
testData.filterValues { it != null }
.mapValues { (_, value) -> value as Int }
// replacing:
testData.mapValues { (_, value) -> value ?: /* default value */ 0 }

两者都给出 Map<String, Int>但第一个在引擎盖下创建并填充了 2 个 map ,第二个使用 0而不是null .

您还可以简化 filterValues -具有适当unchecked cast的变体,作为“我们更了解它”:

testData.filterValues { it != null } as Map<String, Int> // unchecked cast, because: we really do know better, do we? ;-)

或者,您也可以按照您已知的方式处理所有条目(使用 mapNotNull ),然后从中创建一个新 map :

testData.asSequence()
.mapNotNull { (key, value) ->
value?.let {
key to it
}
}
.toMap() // giving Map<String, Int>

如果您更频繁地需要,您甚至可能希望拥有自己的扩展功能:

@Suppress("UNCHECKED_CAST")
fun <K, V> Map<K, V?>.filterValuesNotNull() = filterValues { it != null } as Map<K, V>

现在您可以像下面这样使用它:

testData.filterValuesNotNull() // giving Map<String, Int>

关于kotlin - 相当于 `mapNotNull` 的结果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56149667/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com