Почему сумма двух изменяемых карт в котлине является картой
У меня есть две функции, которые возвращают изменяемые карты
fun mumapone() = mutableMapOf<String, Any>("one" to 1)
fun mumaptwo() = mutableMapOf<String, Any>("two" to 1) + mumapone()
тип веселья
mumaptwo()
становится а не а
MutableMap
, Почему? Кажется, что сумма двух изменяемых карт всегда будет
Map
, это почему?
Я также могу использовать переменные, но результат будет таким же
fun fakeConfig() = xx + yy
val xx = mutableMapOf<String, Any>("one", 1)
val yy = mutableMapOf<String, Any>("two", 1)
тип
fakeConfig()
по-прежнему будет Map, единственный способ изменить это - использовать его или
(xx + yy).toMutatleMap()
Итак, чтобы повторить вопрос, почему сумма двух изменяемых карт становится картой, а не изменяемой картой.
ваше здоровье,
es
5 ответов
Когда вы суммируете две карты, интерфейс, который предполагается по умолчанию, является Map, поскольку MutableMap является реализацией интерфейса, его нельзя предполагать для
+
оператор.
Однако, если вы хотите избежать преобразования или преобразования, вы можете просто создать третью изменяемую карту и просуммировать две другие карты в ней. Эта карта сохранит тип и не будет нуждаться в приведении.
Дополнительная информация в документации kotlin: https://kotlinlang.org/docs/reference/map-operations.html#map-write-operations
В общем, для неизменяемых операторов, которые возвращают вам новую структуру данных.
Вы можете реализовать оператор для MutableMap, но это не будет хорошей идеей, потому что для этого уже существует функция:
fun main() {
val foo = mutableMapOf(1 to "one", 2 to "two")
val bar = mapOf(3 to "three", 4 to "four")
foo.putAll(bar)
println(foo)
}
Выход:
{1=one, 2=two, 3=three, 4=four}
Лучше использовать
+
чтобы получить новую неизменяемую карту или явно использовать изменяемые операции, такие как
putAll()
.
Вы могли написать
mumaptwo
так:
fun mumaptwo() = mumapone().putAll(mutableMapOf<String, Any>("two" to 1))
Изменяемые карты предлагают операции записи для конкретных карт. Эти операции позволяют изменять содержимое карты, используя доступ к значениям на основе ключей.
В
MutableMap
не что иное, как карта с операцией записи
Есть определенные правила, которые определяют операции записи на картах:
Значения можно обновлять. В свою очередь, ключи никогда не меняются: как только вы добавляете запись, ее ключ остается постоянным.
Для каждого ключа всегда есть одно значение, связанное с ним. Вы можете добавлять и удалять записи целиком.
ДОБАВИТЬ Операция
Чтобы добавить новую пару "ключ-значение" к изменяемой карте, используйте
put()
.
Чтобы добавить несколько записей за раз, используйте
putAll()
Вы также можете добавлять новые записи на карты, используя сокращенную форму оператора. Есть два способа:
plusAssign
(+=)
оператор.
в
[]
псевдоним оператора дляset()
.
Из документации:
плюс
Создает новую карту, доступную только для чтения, путем замены или добавления записей на эту карту с другой карты.
operator fun <K, V> Map<out K, V>.plus(
map: Map<out K, V>
): Map<K, V>
Операция плюса определяется только в интерфейсе Map, и ее результатом является неизменяемая карта.
Реализация MutableMap не отменяет эту операцию, поэтому, когда вы вызываете ее с использованием изменяемых карт, вы фактически вызываете операцию Map вместо операции MutableMap. Как вы можете видеть здесь
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/