Добавить в корзинуПозвонить
Найти в Дзене
Умный пульс

Фильтрация списка в Kotlin

В этом руководстве мы рассмотрим различные способы фильтрации списка (List) в Kotlin.
Стандартная библиотека Kotlin предлагает множество удобных функций для фильтрации списков. Эти функции возвращают новый список и могут использоваться как для неизменяемых, так и для изменяемых списков. Для фильтрации применяются предикаты — лямбда-выражения, возвращающие true для элементов, удовлетворяющих условию. Функция filter() возвращает новый список элементов, удовлетворяющих предикату: val countries = listOf("Germany", "India", "Japan", "Brazil", "Australia")
val filterList = countries.filter { it.length > 5 }
assertEquals(3, filterList.size)
assertTrue(filterList.containsAll(listOf("Germany", "Brazil", "Australia"))) Функция filterTo() добавляет отфильтрованные элементы в уже существующий список: val list = mutableListOf("United States", "Canada")
countries.filterTo(list) { it.length > 5 }
assertEquals(5, list.size)
assertTrue(list.containsAll(listOf("United States", "Canada", "Germany", "
Оглавление

1. Обзор

В этом руководстве мы рассмотрим различные способы фильтрации списка (List) в Kotlin.

2. Фильтрация списка


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

Для фильтрации применяются предикаты — лямбда-выражения, возвращающие true для элементов, удовлетворяющих условию.

2.1. filter() и filterTo()

Функция filter() возвращает новый список элементов, удовлетворяющих предикату:

val countries = listOf("Germany", "India", "Japan", "Brazil", "Australia")
val filterList = countries.filter { it.length > 5 }

assertEquals(3, filterList.size)
assertTrue(filterList.containsAll(listOf("Germany", "Brazil", "Australia")))

Функция filterTo() добавляет отфильтрованные элементы в уже существующий список:

val list = mutableListOf("United States", "Canada")
countries.filterTo(list) { it.length > 5 }

assertEquals(5, list.size)
assertTrue(list.containsAll(listOf("United States", "Canada", "Germany", "Brazil", "Australia")))

2.2. filterNot() и filterNotTo()

filterNot() возвращает элементы, не удовлетворяющие предикату:

val filterList = countries.filterNot { it.length > 5 }

assertEquals(2, filterList.size)
assertTrue(filterList.containsAll(listOf("India", "Japan")))

А filterNotTo() — записывает эти элементы в указанный список:

val list = mutableListOf("United States", "Canada")
countries.filterNotTo(list) { it.length > 5 }

assertEquals(4, list.size)
assertTrue(list.containsAll(listOf("United States", "Canada", "India", "Japan")))

2.3. filterIndexed() и filterIndexedTo()

Функция filterIndexed() учитывает индекс элемента при фильтрации:

val filterList = countries.filterIndexed { index, value -> index != 3 && value.length > 5 }

assertEquals(2, filterList.size)
assertTrue(filterList.containsAll(listOf("Germany", "Australia")))

Аналогичная функция filterIndexedTo() добавляет отфильтрованные элементы в другой список:

val list = mutableListOf("United States", "Canada")
countries.filterIndexedTo(list) { index, value -> index != 3 && value.length > 5 }

assertEquals(4, list.size)
assertTrue(list.containsAll(listOf("United States", "Canada", "Germany", "Australia")))

2.4. filterIsInstance() и filterIsInstanceTo()

Позволяет отфильтровать элементы по типу:

val countryCode = listOf("Germany", 49, null, "India", 91, "Japan", 81, "Brazil", null, "Australia", 61)
val filterList = countryCode.filterIsInstance<Int>()

assertEquals(4, filterList.size)
assertTrue(filterList.containsAll(listOf(49, 91, 81, 61)))

Аналогично, filterIsInstanceTo() добавляет элементы нужного типа в список:

val list = mutableListOf(1, 24)
countryCode.filterIsInstanceTo(list)

assertEquals(6, list.size)
assertTrue(list.containsAll(listOf(1, 24, 49, 91, 81, 61)))

2.5. filterNotNull() и filterNotNullTo()

Удаляет null-значения из списка:

val countries = listOf("Germany", "India", null, "Japan", "Brazil", null, "Australia")
val filterList = countries.filterNotNull()

assertEquals(5, filterList.size)
assertTrue(filterList.containsAll(listOf("Germany", "India", "Japan", "Brazil", "Australia")))

А filterNotNullTo() добавляет только не-null элементы в переданный список:

val list = mutableListOf("United States", "Canada")
countries.filterNotNullTo(list)

assertEquals(7, list.size)
assertTrue(list.containsAll(listOf("United States", "Canada", "Germany", "India", "Japan", "Brazil", "Australia")))

3. Фильтрация списка на месте (in-place)


Иногда необходимо
изменить существующий список без создания нового. Для этого нужно использовать MutableList.

3.1. remove()

С использованием итератора:

val countries = mutableListOf("Germany", "India", "Japan", "Brazil", "Australia")
val iterator = countries.iterator()
while (iterator.hasNext()) {
val current = iterator.next()
if (current.length > 5) {
iterator.remove()
}
}

assertEquals(2, countries.size)
assertTrue(countries.containsAll(listOf("India", "Japan")))

3.2. removeAll()

Удаляет все элементы, соответствующие предикату:

countries.removeAll { it.length > 5 }

assertEquals(2, countries.size)
assertTrue(countries.containsAll(listOf("India", "Japan")))

3.3. retainAll()

Оставляет только элементы, соответствующие предикату:

countries.retainAll { it.length > 5 }

assertEquals(3, countries.size)
assertTrue(countries.containsAll(listOf("Germany", "Brazil", "Australia")))

4. Заключение


В этой статье мы рассмотрели различные функции фильтрации списка в Kotlin, включая:

  • filter, filterNot, filterIndexed
  • filterIsInstance, filterNotNull
  • и способы изменения списка на месте через removeAll, retainAll, iterator.remove().

Эти инструменты позволяют гибко работать со списками в Kotlin.

Оригинал статьи: https://www.baeldung.com/kotlin/list-filtering