Мы, разработчики, обычно пишем программное обеспечение, которое ежедневно использует коллекции, код, который имеет дело с такими вещами, как извлечение списка продуктов из базы данных, запись набора данных в файл, такой как CSV, среди прочего, довольно распространен. Итак, давайте посмотрим, как работают коллекции Kotlin и как они сравниваются с Java Collections API.
Как вы можете видеть на этом рисунке, у Kotlin есть изменяемый аналог, который наследует и добавляет такие функции, как fun add(элемент: E) и fun remove(элемент: E) для каждого интерфейса, доступного только для чтения. Классы ArrayList, HashSet, LinkedHashSet, LinkedHashMap и HashMap рассматриваются как реализации MutableList, MutableSet и MutableMap соответственно, и они очень похожи на те, которые вы найдете в Java Collections API, фактически, они те же, но помечены Kotlin как typealias , как видно из Файл библиотеки времени выполнения TypeAliases.kt:
@SinceKotlin("1.1") public actual typealias ArrayList = java.util.ArrayList
@SinceKotlin("1.1") public actual typealias LinkedHashMap = java.util.LinkedHashMap
@SinceKotlin("1.1") public actual typealias HashMap = java.util.HashMap
@SinceKotlin("1.1") public actual typealias LinkedHashSet = java.util.LinkedHashSet
@SinceKotlin("1.1") public actual typealias HashSet = java.util.HashSet
Функции создания коллекций
| Список | Список() | Только для чтения |
| Изменяемый список | ArrayList Of() | Изменчивый |
| Набор | setOf() | Только для чтения |
| Изменяемый набор | хэш-набор() | Изменчивый |
| Карта | mapOf() | Только для чтения |
| Изменяемая карта | хэш-карта() | Изменчивый |
Это функции верхнего уровня, используемые для создания коллекций в Kotlin, пример:
val list = listOf(1, 2, 3)
val mutableArrayList = arrayListOf(1, 2, 3)
val map = mapOf(1 to "one", 2 to "two") //key is an Int valued by a String
val mutableHashMapOf = hashMapOf(1 to "one", 2 to "two")
val set = setOf(1, 2, 3)
val mutableHashSetOf = hashSetOf(1, 2, 3)
Если бы мы хотели создать неизменяемый список на Java, нам пришлось бы обернуть нашу коллекцию в другую, подобную этой:
ListoriginalMutableList = new ArrayList<>(); List unmodifiableList = Collections.unmodifiableList(originalMutableList); // Collections.unmodifiableMap(...); // Collections.unmodifiableSet(...); // and so on...
У нас все равно были бы такие методы, как добавить , удалить и четкий жесткий, поскольку это часть интерфейса списка, и в стандартной Java нет такого различия между списками, доступными только для чтения, и изменяемыми списками.
Фильтр, карта, плоская карта и zip
Фильтр
Фильтрация списков в Kotlin проста и очень похожа на то, как мы работаем с потоками Java 8. В итеративном интерфейсе Kotlin есть метод с именем filter, который принимает предикат для обработки коллекции.
val countries = listOf("Brazil", "Argentina", "Germany")
val filteredCountries = countries.filter { it.length > 6 }
//'it' means the instance itself, in that case a String representing a country name
println(filteredCountries) // prints [Argentina, Germany]
Карта и плоская карта
В значительной степени, как и фильтрация, операции Map и flatMap остаются аналогичными тем, которые можно найти в Java 8 при работе с потоками.
Карта:
val countries = listOf("Brazil", "Argentina", "Germany")
val countriesToLowerCase = countries.map(String::toLowerCase) //same as countries.map { it.toLowerCase() }
println(countriesToLowerCase) //prints [brazil, argentina, germany]
Плоская карта:
val countries = listOf("Brazil", "Argentina", "Germany")
val listOfCharacters = countries.flatMap { it.toList() } // converts to a List of chars
println(listOfCharacters) // prints [B, r, a, z, i, l, A, r, g, e, n, t, i, n, a, G, e, r, m, a, n, y]
застежка-молния:
val countries = listOf("Brazil", "Argentina", "Germany")
val cities = listOf("Aracaju", "Ushuaia", "Berlin")
val zippedPairs = cities.zip(countries) //creates a new list containing an ordered pair of the elements of these two lists
println(zippedPairs) // prints [(Aracaju, Brazil), (Ushuaia, Argentina), (Berlin, Germany)]
Пожалуйста, обратите внимание, что в отличие от потоков Java 8, списки Kotlin быстро оцениваются, что означает, что нет необходимости использовать терминальные методы, такие как collect(), forEach() и т.д… для выполнения промежуточных операций.
Последовательности
Последовательности подобны лениво вычисляемым коллекциям, что означает, что когда мы вызываем такие функции, как filter и map, они будут добавлять промежуточные шаги, которые будут выполняться по запросу, то есть при вызове функции terminal . Примерами терминальных функций являются to List() , first() , sumBy() и max() . Последовательности являются хорошим выбором, когда размер коллекции заранее неизвестен или когда коллекция слишком велика, чтобы ее можно было обработать или сохранить в памяти сразу.
Несмотря на сходство, я бы предпочел Sequences потокам, поскольку он предлагает более идиоматичный, однородный и чистый код при работе с Kotlin. Еще одна важная вещь, которую следует иметь в виду, заключается в том, что на момент написания этой статьи Kotlin нацелен на JDK 1.6 + , что означает, что если вы используете Java 6, работа с последовательностями может быть вашим единственным выбором.
val cities = listOf("Aracaju", "Ushuaia", "Berlin")
val sequence = cities.asSequence().filter { it.startsWith("A") }.map { it.toUpperCase() }
println(sequence.first()) //prints ARACAJU
Kotlin – это прагматичный язык, созданный для решения реальных проблем, он направлен на предоставление популярных функций, которые доказали свою эффективность. Например, в случае с коллекциями у нас есть встроенные хорошо разделенные компоненты как для изменяемых, так и для неизменяемых концепций.
Надеюсь, вам понравилось, большое спасибо! (кстати, это моя первая статья: D).
Оригинал: “https://dev.to/hugoltsp/kotlin-collections-and-how-it-compares-with-java-collections-api-cd4”