gpt4 book ai didi

jvm - 在 Kotlin 中,如何惯用地访问可为空的嵌套映射值,或返回默认值?

转载 作者:行者123 更新时间:2023-12-05 00:15:44 25 4
gpt4 key购买 nike

快速 Kotlin 最佳实践问题,因为我无法真正从文档中找出最好的方法来做到这一点。

假设我有以下嵌套映射(为此问题明确指定的类型):

val userWidgetCount: Map<String, Map<String, Int>> = mapOf(
"rikbrown" to mapOf(
"widgetTypeA" to 1,
"widgetTypeB" to 2))

下面的模式可以更简洁吗?
 fun getUserWidgetCount(username: String, widgetType: String): Int {
return userWidgetCount[username]?.get(widgetType)?:0
}

换句话说,如果用户是已知的并且他们有该小部件类型的条目,我想返回用户小部件计数,否则为零。特别是我看到我可以使用 []最初访问 map 的语法,但在使用 ?. 后,我看不到在第二级执行此操作的方法.

最佳答案

我会为此使用扩展运算符方法。

// Option 1
operator fun <K, V> Map<K, V>?.get(key: K) = this?.get(key)
// Option 2
operator fun <K, K2, V> Map<K, Map<K2, V>>.get(key1: K, key2: K2): V? = get(key1)?.get(key2)

选项 1:

定义提供 get 的扩展可空映射的运算符。在 Kotlin 的 stdlib 中,这种方法出现在 Any?.toString() 中。扩展方法。
fun getUserWidgetCount(username: String, widgetType: String): Int {
return userWidgetCount[username][widgetType] ?: 0
}

选项 2:

为 map 的 map 创建一个特殊的扩展。在我看来,它更好,因为它显示了 map of maps的契约(Contract)。比两个好 get s 连续。
fun getUserWidgetCount(username: String, widgetType: String): Int {
return userWidgetCount[username, widgetType] ?: 0
}

关于jvm - 在 Kotlin 中,如何惯用地访问可为空的嵌套映射值,或返回默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693083/

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