0

在 Kotlin 中,可以将括号表示法与 Map 一起使用,因此以下代码:

  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 类型的可为空的接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?

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

4

2 回答 2

3

因为mapOfMap["Key1"]可以返回 null,因为它无法猜测所需的键是否在地图中。这和打电话是一样的mapOfMap.get("Key1")。第二个地图可以为空,因此它不能.get()在上面调用另一个地图。你可以这样做:mapOfMap["Key1"]?.get("Subkey1")

于 2019-10-29T20:10:50.090 回答
3

mapOfMap["Key1"]返回Map<String, String>?,并且get未为 nullable 指定运算符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"]
于 2019-10-29T21:20:05.663 回答