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

Rik*_*Rik 4 jvm nullable non-nullable kotlin

快速Kotlin最佳实践问题,因为我无法从文档中找到最佳方法.

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

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

以下模式可以更简洁吗?

 fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username]?.get(widgetType)?:0
}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果用户已知并且他们有该窗口小部件类型的条目,我想返回用户窗口小部件计数,否则为零.特别是我看到我[]最初可以使用语法来访问地图,但是在使用之后我无法在第二级看到这样做的方法?..

Yoa*_*erg 5

我会使用扩展运算符方法.

// 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)
Run Code Online (Sandbox Code Playgroud)

选项1:

定义一个get为可空映射提供运算符的扩展.在Kotlin的stdlib中,这种方法出现了Any?.toString()扩展方法.

fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username][widgetType] ?: 0
}
Run Code Online (Sandbox Code Playgroud)

选项2:

为地图地图创建特殊扩展.在我看来,它更好,因为它显示了连续map of maps两个以上的合同get.

fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username, widgetType] ?: 0
}
Run Code Online (Sandbox Code Playgroud)