val name = "John"
val map = mutableMapOf<String, Int>()
// 1. 'John' 키가 없으므로 람다 함수 { key -> key.length } 가 실행됩니다.
// - key는 "John"이 됩니다.
// - "John".length는 4를 반환합니다.
// - map에 {"John" = 4}가 저장되고, 4가 반환됩니다.
val length1 = map.computeIfAbsent(name) { key ->
println("'$key' 키가 없으므로 길이를 계산합니다.") // 이 줄은 처음 한 번만 실행됨
key.length
}
println("반환된 값: $length1") // 반환된 값: 4
println("맵 상태: $map") // 맵 상태: {John=4}
println("--------------------")
// 2. 'John' 키가 이미 존재하므로 람다 함수는 실행되지 않습니다.
// - 기존 값인 4가 즉시 반환됩니다.
val length2 = map.computeIfAbsent(name) { key ->
println("'$key' 키가 없으므로 길이를 계산합니다.") // 이 줄은 실행되지 않음!
key.length
}
println("반환된 값: $length2") // 반환된 값: 4
println("맵 상태: $map") // 맵 상태: {John=4} (변화 없음)
val userPoints = mutableMapOf("alex" to 100, "brian" to 150)
println("초기 상태: $userPoints")
// 1. 'alex' 키가 존재하므로, 람다 함수를 실행해 값을 업데이트합니다.
// - oldValue는 100이 됩니다.
// - 람다는 100 + 50 = 150을 반환합니다.
// - 'alex'의 값은 150으로 변경됩니다.
val updatedAlexPoints = userPoints.computeIfPresent("alex") { key, oldValue ->
println("'$key'의 점수($oldValue)를 업데이트합니다.")
oldValue + 50
}
println("반환된 값: $updatedAlexPoints") // 반환된 값: 150
println("'alex' 업데이트 후: $userPoints")
println("--------------------")
// 2. 'charlie' 키는 존재하지 않으므로, 람다 함수는 실행되지 않습니다.
// - 맵은 변경되지 않고, null이 반환됩니다.
val updatedCharliePoints = userPoints.computeIfPresent("charlie") { key, oldValue ->
// 이 코드는 절대 실행되지 않음!
println("'$key'의 점수($oldValue)를 업데이트합니다.")
oldValue + 50
}
println("반환된 값: $updatedCharliePoints") // 반환된 값: null
println("'charlie' 시도 후: $userPoints")
userPoints.computeIfPresent("brian") { key, oldValue ->
if (oldValue >= 150) {
println("'$key'의 점수가 기준을 충족하여 맵에서 삭제합니다.")
null // null을 반환하면 해당 항목이 삭제됨
} else {
oldValue
}
}
firstKey(), firstEntry()
println("최저 점수: ${studentScores.firstKey()}") // 출력: 최저 점수: 76
println("최고 점수 학생: ${studentScores.lastEntry()}") // 출력: 최고 점수 학생: 95=브라이언
lastKey(), lastEntry()
val topStudent = studentScores.pollLastEntry() // 최고점 학생을 꺼내옴
println("시상할 학생: $topStudent") // 출력: 시상할 학생: 95=브라이언
println("시상 후 남은 학생: $studentScores") // 출력: 시상 후 남은 학생: {76=소피아, 87=에밀리, 91=데이빗}
lowerKey(key): 주어진 key보다 작은 키 중 가장 큰 값 (< key)
floorKey(key): 주어진 key보다 작거나 같은 키 중 가장 큰 값 (<= key)
higherKey(key): 주어진 key보다 큰 키 중 가장 작은 값 (> key)
ceilingKey(key): 주어진 key보다 크거나 같은 키 중 가장 작은 값 (>= key)
headMap(key)
: 처음부터 주어진 key
전까지 맵
tailMap(key)
: 주어진 key
부터 끝까지의 맵
subMap(fromKey, toKey)
: fromKey
부터 toKey
전까지의 맵