Альтернативой является использование функции расширения mapKeys
, которая позволяет переопределить ключ для записи карты:
fun main() {
val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")
val updatedMap = originalMap
.mapKeys {
if (it.key > 1) {
it.key - 1
} else {
it.key
}
}
println(updatedMap) // prints: {1=value2, 2=value3}
}
Обратите внимание, что это не приведет к обновлению карты вместо, но оно создаст новое.Также обратите внимание, что:
В случае, если любые две записи сопоставлены равным ключам, значение последней перезапишет значение, связанное с предыдущей.
Это означает, что если два ключа конфликтуют, в общем случае вы не можете знать, какой из них "выиграет" (если вы не используете LinkedHashMap
, который сохраняет порядок вставки).
Более общийподход будет следующим:
- уменьшить все ключи
- отфильтровать все неположительные ключи
Это потребует 2 полных итераций, (есливы используете Sequences
, которые лениво оцениваются):
fun main() {
val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")
val updatedMap = originalMap
.mapKeys {
it.key - 1
}.filter {
it.key > 0
}
println(updatedMap)
}