Map.getOrElse: treat nulls as missing values.
This commit is contained in:
@@ -17,7 +17,7 @@ public fun <K, V: Any> Map<K, V>.getOrImplicitDefault(key: K): V {
|
||||
if (this is MapWithDefault)
|
||||
return this.getOrImplicitDefault(key)
|
||||
|
||||
return getOrElse(key, { throw NoSuchElementException("Key $key is missing in the map.") })
|
||||
return getOrElseNullable(key, { throw NoSuchElementException("Key $key is missing in the map.") })
|
||||
}
|
||||
|
||||
@kotlin.jvm.JvmName("getOrImplicitDefaultNullable")
|
||||
@@ -26,7 +26,7 @@ public fun <K, V> Map<K, V>.getOrImplicitDefault(key: K): V {
|
||||
if (this is MapWithDefault)
|
||||
return this.getOrImplicitDefault(key)
|
||||
|
||||
return getOrElse(key, { throw NoSuchElementException("Key $key is missing in the map.") })
|
||||
return getOrElseNullable(key, { throw NoSuchElementException("Key $key is missing in the map.") })
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,7 +83,7 @@ private class MapWithDefaultImpl<K, out V>(public override val map: Map<K,V>, pr
|
||||
override val values: Collection<V> get() = map.values
|
||||
override val entries: Set<Map.Entry<K, V>> get() = map.entries
|
||||
|
||||
override fun getOrImplicitDefault(key: K): V = map.getOrElse(key, { default(key) })
|
||||
override fun getOrImplicitDefault(key: K): V = map.getOrElseNullable(key, { default(key) })
|
||||
}
|
||||
|
||||
private class MutableMapWithDefaultImpl<K, V>(public override val map: MutableMap<K, V>, private val default: (key: K) -> V): MutableMapWithDefault<K, V> {
|
||||
@@ -104,6 +104,6 @@ private class MutableMapWithDefaultImpl<K, V>(public override val map: MutableMa
|
||||
override fun putAll(m: Map<out K, V>) = map.putAll(m)
|
||||
override fun clear() = map.clear()
|
||||
|
||||
override fun getOrImplicitDefault(key: K): V = map.getOrElse(key, { default(key) })
|
||||
override fun getOrImplicitDefault(key: K): V = map.getOrElseNullable(key, { default(key) })
|
||||
}
|
||||
|
||||
|
||||
@@ -170,8 +170,16 @@ public fun <K, V> Map.Entry<K, V>.toPair(): Pair<K, V> = Pair(key, value)
|
||||
*
|
||||
* @sample test.collections.MapTest.getOrElse
|
||||
*/
|
||||
@Deprecated("This function will change its behavior soon not to distinguish missing keys and keys mapped to nulls. To stick with the new behavior you can use get(key) with ?: operator after instead.")
|
||||
public inline fun <K, V> Map<K, V>.getOrElse(key: K, defaultValue: () -> V): V {
|
||||
val value = get(key)
|
||||
if (value == null) {
|
||||
return defaultValue()
|
||||
} else {
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
internal inline fun <K, V> Map<K, V>.getOrElseNullable(key: K, defaultValue: () -> V): V {
|
||||
val value = get(key)
|
||||
if (value == null && !containsKey(key)) {
|
||||
return defaultValue()
|
||||
@@ -180,6 +188,8 @@ public inline fun <K, V> Map<K, V>.getOrElse(key: K, defaultValue: () -> V): V {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the value for the given key. If the key is not found in the map, calls the [defaultValue] function,
|
||||
* puts its result into the map under the given key and returns it.
|
||||
|
||||
Reference in New Issue
Block a user