From 2f8a431a79b18bae0a2b75b9185c8320f57a0cc6 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 22 Jun 2015 20:50:05 +0300 Subject: [PATCH] Change getOrElse and getOrPut implementations so that double lookup is made when map doesn't contain value, rather when does. --- libraries/stdlib/src/kotlin/collections/Maps.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index b8024001b31..2a694cc2aea 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -145,10 +145,11 @@ public fun Map.Entry.toPair(): Pair { * @sample test.collections.MapTest.getOrElse */ public inline fun Map.getOrElse(key: K, defaultValue: () -> V): V { - if (containsKey(key)) { - return get(key) as V - } else { + val value = get(key) + if (value == null && !containsKey(key)) { return defaultValue() + } else { + return value as V } } @@ -159,12 +160,13 @@ public inline fun Map.getOrElse(key: K, defaultValue: () -> V): V { * @sample test.collections.MapTest.getOrPut */ public inline fun MutableMap.getOrPut(key: K, defaultValue: () -> V): V { - if (containsKey(key)) { - return get(key) as V - } else { + val value = get(key) + if (value == null && !containsKey(key)) { val answer = defaultValue() put(key, answer) return answer + } else { + return value as V } }