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

Jvm 在Kotlin中,如何习惯性地访问可为空的嵌套映射值,或返回默认值?,jvm,kotlin,nullable,non-nullable,Jvm,Kotlin,Nullable,Non Nullable,Quick Kotlin最佳实践问题,因为我无法从文档中找到实现这一点的最佳方法 假设我有以下嵌套映射(键入为解决此问题而明确指定的): 换句话说,如果用户是已知的,并且他们有该窗口小部件类型的条目,我想返回用户窗口小部件计数,否则为零。特别是,我看到我可以使用[]语法最初访问映射,但在使用?”之后,我看不到在第二级执行此操作的方法。我将使用扩展运算符方法 // Option 1 operator fun <K, V> Map<K, V>?.get(key: K) = t

Quick Kotlin最佳实践问题,因为我无法从文档中找到实现这一点的最佳方法

假设我有以下嵌套映射(键入为解决此问题而明确指定的):


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

我将使用扩展运算符方法

// 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)
选项2:

为地图的地图创建一个特殊的扩展名。在我看来,它更好,因为它比两个
get
s连成一行更好地显示了
map
的契约

fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username, widgetType] ?: 0
}

谢谢你,两个都很好。我还没有决定我更喜欢哪一个(我不完全相信选项2实际上更好地显示了映射契约的映射),但无论如何,这两个都是简洁的解决方案——我需要更多地考虑Kotlin世界中的扩展方法(和操作符…)。
// 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)
fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username][widgetType] ?: 0
}
fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username, widgetType] ?: 0
}