fbpx

Blog

Эффективно работаем с коллекциями в Kotlin

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

Drop

Drop удаляет первые n элементов из коллекции.

val numbers = listOf(1, 2, 3, 4, 5)
val dropped = numbers.drop(2)
// The dropped list now contains [3, 4, 5].

Filter

Filter вернёт список, который соответствует предикату. Есть еще FilterNot который инвертирует предикат.

val numbers = listOf(1, 2, 3, 4, 5)
val smallerThan3 = numbers.filter { n -> n < 3 }
// The resulting list has these numbers [1, 2].

Take

Take – противоположность функции drop. С помощью take можно оставить первые n элементов из коллекции.

val numbers = listOf(1, 2, 3, 4, 5)
val first2 = numbers.take(2)
// Берет первые 2 элемента. Теперь список такой [1, 2]

Any

Any возращает true если хоть один элемент коллекции соответсвует предикату.

val numbers = listOf(1, 2, 3, 4, 5)
val hasEvens = numbers.any { n -> n % 2 == 0 }
// Any вернет true - так как есть элементы в коллекции, которые 
// делятся на 2 без остатка

All

All похож на Any, однако работает наоборот. Возвращает true, если все элементы коллекции соответствуют переданному предикату.

val numbers = listOf(1, 2, 3, 4, 5)
val allEven = numbers.all { n -> n % 2 == 0 }
// Результат будет false - так как в списке есть элементы, которые // не соответствуют предикату

Count

Count возвращает кол-во элементов, соответствующих предикату

val numbers = listOf(1, 2, 3, 4, 5)
val evenCount = numbers.count { n -> n % 2 == 0 }
// значение переменной evenCount = 2 потому что только 2 элементы 
// подходят 

GroupBy

groupBy группирует значения по некоторому критерию. Например, мы хотим разбить список пользователей по возрасту.

val users = listOf(User("Vasya", 50),User("Misha", 24), User("Rodion", 24)) 
println(users.groupBy { it.age }) 
// Результат {50=[User(name=Vasya, age=50)], 24=[User(name=Misha, age=24),User(name=Rodion, age=24)]}

AssociateBy

Эта функция похожа на groupBy, но не создает список со значениями в результирующей хэш-таблице, а возвращает сразу map

val numbers = listOf(1, 2, 3, 4, 5)
val groupped = numbers.associateBy { n -> n.toString() }
// Результат [“1”: 1, “2”:2, “3”:3, “4”:4, “5”:5]