Элемент приращения в изменяемой карте в Котлине

Я перехожу на Kotlin 1.3 из Scala. Я пытаюсь сделать что-то очень простое:

class Foo {
    fun bar() {
        val map = mutableMapOf<String, Int>()
        val index = "foo"
        if (index !in map)
          map[index] = 0
        else
          map[index]!! += 1
    }
}

Однако IntelliJ 2020 дает мне ошибку в +=оператор, жалуясь, что "ожидаемая переменная", что для меня непрозрачно. Почему я не могу этого сделать? Я перепробовал множество вариантов, но ни один из них не работает. IntelliJ даже предлагает сгенерировать идентичный код, если я оставлю !! оператор и выберите Add non-null asserted (!!) call из контекстного меню.

1 ответ

Поскольку operator fun get() возвращает null, если ключ не существует, вы можете использовать нулевую безопасность вместо проверки if:

val toPut = map[index]?.plus(3) ?: 0
map[index] = toPut

Причина, по которой вы не можете использовать + это потому что operator fun Int.plus() применимо только к ненулевым Intтипы. Хотя это выглядит не так уж плохо.

Другие вопросы по тегам