Операции записи коллекций

Изменяемые коллекции поддерживают операции, изменяющие её содержимое, например, операции по добавлению и удалению элементов. В этом разделе описаны операции записи, доступные для всех реализаций MutableCollection. Более конкретные операции, доступные для List и Map, описаны в разделах List: специфичные операции и Map: специфичные операции.

Добавление элементов

Чтобы добавить один элемент в список или множество (Set), используйте функцию add(). Указанный объект будет добавлен в конец коллекции.

fun main() {
    val numbers = mutableListOf(1, 2, 3, 4)
    numbers.add(5)
    println(numbers) // [1, 2, 3, 4, 5]
}

Функция addAll() добавляет все элементы из переданного в качестве аргумента объекта в список или множество. Аргументом может быть Iterable, Sequence, или Array. Типы объекта-получателя и аргумента могут быть разными, например, вы можете добавить все элементы из Set в List.

При вызове к списку addAll() добавляет новые элементы в том же порядке, в котором они находятся в коллекции-аргументе. Вы также можете передать addAll() позицию, в которую будет вставлен первый элемент из коллекции-аргумента. За ним последуют другие элементы из коллекции-аргумента, сдвигая элементы коллекции-получателя в конец.

fun main() {
    val numbers = mutableListOf(1, 2, 5, 6)
    numbers.addAll(arrayOf(7, 8))
    println(numbers) // [1, 2, 5, 6, 7, 8]
    numbers.addAll(2, setOf(3, 4))
    println(numbers) // [1, 2, 3, 4, 5, 6, 7, 8]
}

Вы также можете добавлять элементы, используя in-place версию оператора plus - plusAssign (+=). При применении к изменяемой коллекции += добавляет второй операнд (элемент или другую коллекцию) в конец коллекции.

fun main() {
    val numbers = mutableListOf("one", "two")
    numbers += "three"
    println(numbers) // [one, two, three]
    numbers += listOf("four", "five")    
    println(numbers) // [one, two, three, four, five]
}

Удаление элементов

Чтобы удалить элемент из изменяемой коллекции, используйте функцию remove(). Она принимает значение элемента в качестве аргумента и удаляет из коллекции одно вхождение этого значения.

fun main() {
    val numbers = mutableListOf(1, 2, 3, 4, 3)
    numbers.remove(3) // удаляет только первое значение `3`
    println(numbers) // [1, 2, 4, 3]
    numbers.remove(5) // ничего не удаляет
    println(numbers) // [1, 2, 4, 3]
}

Для одновременного удаления нескольких элементов существуют следующие функции:

  • removeAll() - удаляет все элементы, присутствующие в коллекции-аргументе. В качестве альтернативы вы можете вызвать её с предикатом; в этом случае функция удаляет все элементы, для которых предикат возвращает true.
  • retainAll() - противоположность removeAll(): удаляет все элементы кроме тех, что находятся в коллекции-аргументе. При использовании с предикатом она оставляет только те элементы, которые ему соответствуют.
  • clear() - удаляет все элементы из списка, оставляя его пустым.
fun main() {
    val numbers = mutableListOf(1, 2, 3, 4)
    println(numbers) // [1, 2, 3, 4]
    numbers.retainAll { it >= 3 }
    println(numbers) // [3, 4]
    numbers.clear()
    println(numbers) // []

    val numbersSet = mutableSetOf("one", "two", "three", "four")
    numbersSet.removeAll(setOf("one", "two"))
    println(numbersSet) // [three, four]
}

Еще один способ для удаления элементов из коллекции - оператор minusAssign (-=) - это in-place версия оператора minus. Второй аргумент может быть либо одним элементом, либо другой коллекцией. Если второй аргумент - это элемент, то оператор -= удалит первое вхождение этого элемента. Если же второй аргумент - это коллекция, то будут удалены все вхождения её элементов. Например, если список содержит повторяющиеся элементы, то они все будут удалены. Второй операнд может содержать элементы, которых нет в коллекции. Такие элементы не влияют на выполнение операции.

fun main() {
    val numbers = mutableListOf("one", "two", "three", "three", "four")
    numbers -= "three"
    println(numbers) // [one, two, three, four]
    numbers -= listOf("four", "five")    
    //numbers -= listOf("four") // делает то же самое, что и выше
    println(numbers) // [one, two, three]
}

Обновление элементов

Списки и ассоциативные списки также предоставляют операции для обновления элементов. Они описаны в разделах List: специфичные операции и Map: специфичные операции. Для Set обновление элементов не имеет смысла, поскольку фактически он удаляет элемент и добавляет другой.