Spec-Zone.ru › Kotlin 2

Получение частей коллекции

Стандартная библиотека Kotlin содержит функции расширения для получения частей коллекции. Эти функции предлагают различные способы выбора элементов для результирующей коллекции: явное перечисление их позиций, указание размера результата и другие.

Срез

slice() возвращает список элементов коллекции с заданными индексами. Индексы можно передать как диапазон или как коллекцию целых чисел.


fun main() {
//sampleStart    
    val numbers = listOf("one", "two", "three", "four", "five", "six")    
    println(numbers.slice(1..3))
    println(numbers.slice(0..4 step 2))
    println(numbers.slice(setOf(3, 5, 0)))    
//sampleEnd
}

Получение и отбрасывание элементов

Чтобы получить заданное количество элементов, начиная с первого, используйте функцию take(). Чтобы получить последние элементы, используйте takeLast(). Если передать число, превышающее размер коллекции, обе функции возвращают всю коллекцию.

Чтобы получить все элементы, кроме заданного количества первых или последних элементов, вызовите соответственно функции drop() и dropLast().


fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.take(3))
    println(numbers.takeLast(3))
    println(numbers.drop(1))
    println(numbers.dropLast(5))
//sampleEnd
}

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

  • takeWhile() — это take() с предикатом: функция получает элементы до первого элемента, не соответствующего предикату, не включая его. Если первый элемент коллекции не соответствует предикату, результат будет пустым.

  • takeLastWhile() похожа на takeLast(): функция получает диапазон элементов, соответствующих предикату, начиная с конца коллекции. Первый элемент диапазона — это элемент, следующий за последним элементом, не соответствующим предикату. Если последний элемент коллекции не соответствует предикату, результат будет пустым;

  • dropWhile() противоположна takeWhile() с тем же предикатом: она возвращает элементы, начиная с первого элемента, не соответствующего предикату, и до конца.

  • dropLastWhile() противоположна takeLastWhile() с тем же предикатом: она возвращает элементы от начала до последнего элемента, не соответствующего предикату.


fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.takeWhile { !it.startsWith('f') })
    println(numbers.takeLastWhile { it != "three" })
    println(numbers.dropWhile { it.length == 3 })
    println(numbers.dropLastWhile { it.contains('i') })
//sampleEnd
}

Разбиение на части

Чтобы разбить коллекцию на части заданного размера, используйте функцию chunked(). chunked() принимает один аргумент — размер части — и возвращает List из List заданного размера. Первая часть начинается с первого элемента и содержит size элементов, вторая часть содержит следующие size элементов и так далее. Последняя часть может быть меньше.


fun main() {
//sampleStart
    val numbers = (0..13).toList()
    println(numbers.chunked(3))
//sampleEnd
}

Можно также сразу применить преобразование к возвращаемым частям. Для этого при вызове chunked() передайте преобразование в виде лямбда-функции. Аргумент лямбда-функции — это часть коллекции. При вызове chunked() с преобразованием создаются кратковременно существующие List, которые следует обработать непосредственно в этой лямбда-функции.


fun main() {
//sampleStart
    val numbers = (0..13).toList() 
    println(numbers.chunked(3) { it.sum() })  // `it` is a chunk of the original collection
//sampleEnd
}

Скользящие окна

Можно получить все возможные диапазоны элементов коллекции заданного размера. Функция для их получения называется windowed(): она возвращает список диапазонов элементов, которые можно увидеть, рассматривая коллекцию через скользящее окно заданного размера. В отличие от chunked(), windowed() возвращает диапазоны элементов (окна), начинающиеся с каждого элемента коллекции. Все окна возвращаются как элементы одного List.


fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")    
    println(numbers.windowed(3))
//sampleEnd
}

windowed() предоставляет больше возможностей благодаря параметрам со значениями по умолчанию:

  • step задаёт расстояние между первыми элементами двух соседних окон. По умолчанию оно равно 1, поэтому результат содержит окна, начинающиеся с каждого элемента. Если увеличить шаг до 2, будут возвращены только окна, начинающиеся с нечётных элементов: первого, третьего и так далее.

  • partialWindows включает окна меньшего размера, начинающиеся с элементов в конце коллекции. Например, если запросить окна из трёх элементов, для последних двух элементов создать их не получится. Включение partialWindows в этом случае добавит ещё два списка размером 2 и 1.

Наконец, можно сразу применить преобразование к возвращаемым диапазонам. Для этого при вызове windowed() передайте преобразование в виде лямбда-функции.


fun main() {
//sampleStart
    val numbers = (1..10).toList()
    println(numbers.windowed(3, step = 2, partialWindows = true))
    println(numbers.windowed(3) { it.sum() })
//sampleEnd
}

Для создания окон из двух элементов существует отдельная функция — zipWithNext(). Она создаёт пары соседних элементов коллекции-получателя. Обратите внимание: zipWithNext() не разбивает коллекцию на пары; она создаёт Pair для каждого элемента, кроме последнего, поэтому результат для [1, 2, 3, 4] — это [[1, 2], [2, 3], [3, 4]], а не [[1, 2], [3, 4]]. zipWithNext() также можно вызвать с функцией преобразования; она должна принимать два элемента коллекции-получателя в качестве аргументов.


fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")    
    println(numbers.zipWithNext())
    println(numbers.zipWithNext() { s1, s2 -> s1.length > s2.length})
//sampleEnd
}
12 августа 2026
Фильтрация коллекцийПолучение отдельных элементов

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/collection-parts.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API