inline fun <K, V> MutableMap<K, V>.getOrPut(
    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.

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

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

fun main(args: Array<String>) {
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