Функция partition

Функция partition разделяет исходную коллекцию на две новые коллекции по заданному предикату (условию). Элементы, для которых предикат возвращает true, попадают в первую коллекцию, а элементы, для которых предикат возвращает false, попадают во вторую коллекцию. Функция возвращает пару Pair из двух коллекций.

Синтаксис

kotlin// Для Iterable<T>
inline fun <T> Iterable<T>.partition(
  predicate: (T) -> Boolean
): Pair<List<T>, List<T>>
kotlin// Для Array<T>
inline fun <T> Array<T>.partition(
  predicate: (T) -> Boolean
): Pair<List<T>, List<T>>
kotlin// Для List<T>
inline fun <T> List<T>.partition(
  predicate: (T) -> Boolean
): Pair<List<T>, List<T>>
kotlin// Для Set<T>
inline fun <T> Set<T>.partition(
  predicate: (T) -> Boolean
): Pair<List<T>, List<T>>

Для каких типов коллекций работает

Функция partition доступна для следующих типов коллекций:

Для Map функция partition недоступна напрямую, но можно использовать entries.partition().

Пример

Разделим массив чисел на четные и нечетные:

kotlinval numbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val (even, odd) = numbers.partition { it % 2 == 0 }

println("Even numbers: $even")
println("Odd numbers: $odd")

Результат выполнения кода:

kotlinEven numbers: [2, 4, 6, 8, 10]
Odd numbers: [1, 3, 5, 7, 9]

Пример

Разделим список строк на короткие (длина ≤ 3) и длинные:

kotlinval words = listOf("a", "ab", "abc", "abcd", "abcde")
val (short, long) = words.partition { it.length <= 3 }

println("Short words: $short")
println("Long words: $long")

Результат выполнения кода:

kotlinShort words: [a, ab, abc]
Long words: [abcd, abcde]

Пример

Разделим множество чисел на положительные и неположительные:

kotlinval numbersSet = setOf(-5, -3, 0, 2, 4, 6)
val (positive, nonPositive) = numbersSet.partition { it > 0 }

println("Positive: $positive")
println("Non-positive: $nonPositive")

Результат выполнения кода:

kotlinPositive: [2, 4, 6]
Non-positive: [-5, -3, 0]

Пример

Использование partition с Map через entries:

kotlinval map = mapOf("a" to 1, "b" to 2, "c" to 3, "d" to 4)
val (evenEntries, oddEntries) = map.entries.partition { it.value % 2 == 0 }

println("Even entries: $evenEntries")
println("Odd entries: $oddEntries")

Результат выполнения кода:

kotlinEven entries: [b=2, d=4]
Odd entries: [a=1, c=3]

Смотрите также

  • функцию filter,
    которая фильтрует элементы по условию
  • функцию takeWhile,
    которая берет элементы, пока выполняется условие
  • функцию dropWhile,
    которая пропускает элементы, пока выполняется условие
  • функцию groupBy,
    которая группирует элементы по ключу