在地图上使用
.withDefault
时,我可以设置一个默认值,以便在给定的键不在地图上时使用 .getValue
。
当我复制该地图时,问题就出现了。我之前设置的默认值不会保留。
为什么在进行复制时未保留默认值的环绕?这是预期的行为吗?这里有我遗漏的东西吗?
我做了这个最小的可重现示例来说明问题:
@Test
fun `withDefault not preserved when copying a map`() {
val map = mapOf<Int, Int>().withDefault { 0 }
assertEquals(map.getValue(1), 0)
val mapCopy = map.toMap()
assertThrows<NoSuchElementException> { mapCopy.getValue(1) }
}
如文档中所述:
返回此只读映射的包装器,具有由指定函数defaultValue提供的隐式默认值。
因此该操作不是更改数据本身,而是拦截用于检索值的调用,并在不存在时返回默认值。
toMap
复制底层地图而不是包装器。