设置默认值(找不到键值时返回默认值)

  1. val map = mapOf(
  2. "java" to 1,
  3. "kotlin" to 2,
  4. "python" to 3
  5. ).withDefault { "?" }
  6. println(map.getValue("java")) // 1
  7. println(map.getValue("kotlin")) // 2
  8. println(map.getValue("c++")) // ?

源码实现也非常简单,当返回值为 null 时,返回设置的默认值。

  1. internal inline fun <K, V> Map<K, V>.getOrElseNullable(key: K, defaultValue: () -> V): V {
  2. val value = get(key)
  3. if (value == null && !containsKey(key)) {
  4. return defaultValue()
  5. } else {
  6. @Suppress("UNCHECKED_CAST")
  7. return value as V
  8. }
  9. }

但是这种写法和 plus 操作符在一起用,有一个 bug ,看一下下面这个例子。

  1. val newMap = map + mapOf("python" to 3)
  2. println(newMap.getValue("c++")) // 调用 getValue 时抛出异常,异常信息:Key c++ is missing in the map.

这段代码的意思就是,通过 plus(+) 操作符合并两个 map,返回一个新的 map, 但是忽略了默认值,所以看到上面的错误信息,我们在开发的时候需要注意这点。