getOrPut

inline fun <K, V> MutableMap<K, V>.getOrPut(key: K, defaultValue: () -> V): V(source)

Returns the value for the given key if the value is present and not null. Otherwise, calls the defaultValue function, puts its result into the map under the given key and returns the call result.

Note that the operation is not guaranteed to be atomic if the map is being modified concurrently.

Since Kotlin

1.0

Samples

import kotlin.test.*
import java.util.*

fun main() { 
   //sampleStart 
   val map = mutableMapOf<String, Int?>()

println(map.getOrPut("x") { 2 }) // 2
// subsequent calls to getOrPut do not evaluate the default value
// since the first getOrPut has already stored value 2 in the map
println(map.getOrPut("x") { 3 }) // 2

// however null value mapped to a key is treated the same as the missing value
println(map.getOrPut("y") { null }) // null
// so in that case the default value is evaluated
println(map.getOrPut("y") { 42 }) // 42 
   //sampleEnd
}
inline fun <K, V> ConcurrentMap<K, V>.getOrPut(key: K, defaultValue: () -> V): V(source)

Concurrent getOrPut, that is safe for concurrent maps.

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.

This method guarantees not to put the value into the map if the key is already there, but the defaultValue function may be invoked even if the key is already in the map.

Since Kotlin

1.0