Функция slice() возвращает часть коллекции, элементы которой располагаются на определенных индексах. Индексы передаеются в функцию
либо в виде диапазона IntRange
, либо коллекции значений Iterable<Int>
. Результатом функции является список
List<T>, который содержит элементы по указанным индексам:
val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike") println(people.slice(1..3)) // [Bob, Sam, Kate] println(people.slice(0..5 step 2)) // [Tom, Sam, Alice] println(people.slice(listOf(1, 3, 5, 1))) // [Bob, Kate, Mike, Bob]
Стоит отметить, что для последовательностей эта функция не доступна.
Функция take() извлекает из начала коллекции/последовательности определенное количество элементов
take(n: Int): List<T>/Sequence<T>
Например, выберем 3 первых элементов:
val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike") println(people.take(3)) // ["Tom", "Bob", "Sam"]
Для коллекций также доступна функция takeLast(), которая извлекает определенное количество элементов из конца коллекции
val people = listOf("Tom", "Bob", "Sam", "Kate", "Alice", "Mike") // получаем три последних элемента println(people.takeLast(3)) // ["Kate", "Alice", "Mike"]
Функция takeWhile() отбирает элементы с начала коллекции/последовательности, которые соответвуют условию предиката:
takeWhile(predicate: (T) -> Boolean): List<T> // для коллекций takeWhile(predicate: (T) -> Boolean): Sequence<T> // для последовательностей
функция предиката получает в качестве параметра текущий элемент и возращает true, если элемент соответствует условию:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.takeWhile{it.length == 3} println(part) // ["Tom", "Sam"]
В данном случае условие предиката возвращает true, если длина строки равна 3: {it.length == 3}
,
поэтому функция takeWhile отбирает строки, пока они соответствуют этому условию. Так, в данном случае в результирующем списке окажется первые два элемента:
["Tom", "Sam"]
. Когда функция takeWhile()
встретит хоть один элемент, который не соответствует условию, она завершит работу.
Хотя в списке people есть еще элементы с длиной в три символа (элемент "Bob"
). Поэтому если в списке первый элемент уже не соответствует условию предиката, то функция возвратит пустой список:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.takeWhile{it.length == 4} // выбираем строки с длиной в 4 символа println(part) // [] - пустой список
Для коллекций также доступа функция takeLastWhile(), которая работает аналогичным образом, только выбирает элементы с конца списка
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.takeLastWhile{it.length !=3} // длина НЕ равна 3 println(part) // ["Alice", "Mike"]
Функция drop() позволяет пропустить определенное количество элементов в коллекции/последовательности:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.drop(3) // пропускаем первые 3 элемента println(part) // [Bob, Alice, Mike]
Для коллекций также доступна функция dropLast(), которая проупскает определенное количество элементов из конца коллекции
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.dropLast(2) // пропускаем последние 2 элемента println(part) // [Tom, Sam, Kate, Bob]
Функция dropWhile() пропускает элементы с начала коллекции/последовательности, которые соответвуют условию предиката:
dropWhile(predicate: (T) -> Boolean): List<T> // для коллекций dropWhile(predicate: (T) -> Boolean): Sequence<T> // для последовательностей
функция предиката получает в качестве параметра текущий элемент и возращает true, если элемент соответствует условию:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.dropWhile{it.length == 3} println(part) // [Kate, Bob, Alice, Mike]
В данном случае условие предиката возвращает true, если длина строки равна 3: {it.length == 3}
,
поэтому функция dropWhile()
пропускает строки, пока они соответствуют этому условию. Так, в данном случае в результирующем списке окажется первые два элемента:
[Kate, Bob, Alice, Mike]
. Когда функция dropWhile()
встретит хоть один элемент, который не соответствует условию, она завершит работу.
Хотя в списке people есть еще элементы с длиной в три символа (элемент "Bob"
). Поэтому если в списке первый элемент уже не соответствует условию предиката, то функция возвратит список со всеми элементами.
Для коллекций также доступа функция dropLastWhile(), которая работает аналогичным образом, только пропускает элементы с конца списка
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val part = people.dropLastWhile{it.length !=3} // длина НЕ равна 3 println(part) // ["Tom", "Sam", "Kate", "Bob"]
Функция chuncked() позволяет разбить коллекцию/последовательность на списки определенной длины:
chunked(size: Int): List<List<T>> // для коллекций chunked(size: Int): Sequence<List<T>> // для последовательностей
В качестве параметра в функцию передается размер списков, в которые будут помещаться элементы:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val parts = people.chunked(3) println(parts) // [[Tom, Sam, Kate], [Bob, Alice, Mike]]
В данном случае разбиваем коллекцию на списки по 3 элемента, соответственно результирующая коллекция будет содержать два списка по три элемента.
Дополнительная версия функции в качестве второго параметра принимает функцию преобразования элементов:
chunked(size: Int, transform: (List<T>) -> R): List<R> // для коллекций chunked(size: Int,transform: (List<T>) -> R): Sequence<R> // для последовательностей
То есть сначала коллекция/последовательность разбивается на несколько списков длиной size, затем каждый список передается в функцию преобразования, где на его основе можно сгенерировать новое значение. Например:
val people = listOf("Tom", "Sam", "Kate", "Bob", "Alice", "Mike") val parts = people.chunked(3){it.first()} println(parts) // [Tom, Bob]
В данном случае коллекция разделяется на два списка длиной по 3 элемента. В функции преобразования из каждого списка выбирается и возвращается первый элемент каждого списка. Соответственно результатом функции будет список из двух первых элементов.