Операции записи коллекций
Изменяемые коллекции поддерживают операции, изменяющие её содержимое, например, операции по добавлению и удалению элементов. В этом разделе описаны операции записи, доступные для всех реализаций 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 обновление элементов не имеет смысла, поскольку фактически он удаляет элемент и добавляет другой.