在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断言(!!。)调用吗?
处理此问题的正确方法是什么?
答案 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"]