4

快速 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
}

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

4

1 回答 1

6

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

// 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 of maps优于get连续两个s的合同。

fun getUserWidgetCount(username: String, widgetType: String): Int {
    return userWidgetCount[username, widgetType] ?: 0
}
于 2017-04-29T10:43:37.883 回答