В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию?

Вопрос о быстрой практике Quick 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 } 

Другими словами, я хочу вернуть счетчик виджета пользователя, если пользователь известен, и у него есть запись для этого типа виджетов, в противном случае – ноль. В частности, я видел, что я могу использовать синтаксис [] для первоначального доступа к карте, но после использования этого я не мог увидеть способ сделать это на втором уровне ?. ,

Для этого я бы использовал метод оператора расширения.

 // 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 для карты с нулевым значением. В stdlib Kotlin такой подход появляется с методом расширения Any?.toString() .

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

Вариант 2:

Создайте специальное расширение для карты карт. На мой взгляд, это лучше, потому что он показывает контракт map of maps лучше, чем два раза подряд.

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