科特林Map中的方括号表示法

时间:2019-10-29 20:00:25

标签: kotlin hashmap kotlin-null-safety

在Kotlin中,可以在地图中使用括号符号,因此以下代码:

  val mapOfMap: Map<String, Map<String, String>> = mapOf("Key1" to mapOf("Subkey1" to "Value1", "Subkey2" to "Value2"))
  println(mapOfMap["Key1"])

打印:

{Subkey1=Value1, Subkey2=Value2}

太好了。但是为什么我不能做以下

println(mapOfMap["Key1"]["Subkey1"])

它会导致编译错误: 在类型为Map的可为空的接收器上仅允许安全(?。)或非null断言(!!。)调用吗?

处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

因为mapOfMap["Key1"]可能返回null,因为它无法猜测所需的键是否在地图中。与调用mapOfMap.get("Key1")相同。第二个映射可以为null,因此无法在其上调用另一个.get()。您可以改为:mapOfMap["Key1"]?.get("Subkey1")

答案 1 :(得分:3)

mapOfMap["Key1"]返回Map<String, String>?,并且没有为可空get指定Map运算符。因此,以下代码无法编译:

mapOfMap["Key1"]["Subkey1"]

您可以通过使用可空的get接收器创建扩展operator Map函数来使其编译:

operator fun <K, V> Map<K, V>?.get(key: K): V? = this?.get(key)

您还可以为地图的地图创建扩展功能get operator

operator fun <K1, K2, V> Map<K1, Map<K2, V>>.get(key1: K1, key2: K2): V? = get(key1)?.get(key2)

并以这种方式使用它:

mapOfMap["Key1", "Subkey1"]