Рубрики
Без рубрики

Коллекции Kotlin и как это сравнивается с Java Collections API

Коллекции Kotlin и их сравнение с Java Collections API. С тегами kotlin, java, программирование, коллекции.

Мы, разработчики, обычно пишем программное обеспечение, которое ежедневно использует коллекции, код, который имеет дело с такими вещами, как извлечение списка продуктов из базы данных, запись набора данных в файл, такой как 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, нам пришлось бы обернуть нашу коллекцию в другую, подобную этой:

    List originalMutableList = 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”