3. Узнайте больше о коллекциях
В этом задании вы узнаете больше о коллекциях, включая списки, и о новом типе коллекций.HashMap
Шаг 1: Узнайте больше о списках
- Списки и изменяемые списки были рассмотрены в предыдущем уроке. Это очень распространенные структуры данных, поэтому Kotlin предоставляет для них ряд встроенных функций. Ознакомьтесь с этим частичным списком функций для списков. Полные списки функций для списков
Listи изменяемых списков можно найти в документации KotlinMutableList.
Функция | Цель |
| Добавить элемент в изменяемый список. |
| Удалить элемент из изменяемого списка. |
| Возвращает копию списка с элементами в обратном порядке. |
| Верните значение, |
| Возвращает часть списка, начиная с первого индекса и заканчивая вторым индексом, но не включая его. |
- Продолжая работу в REPL, создайте список чисел и вызовите
sum()к нему метод. Это суммирует все элементы.
val list = listOf(1, 5, 3, 4)
println(list.sum())
⇒ 13
- Создайте список строк и просуммируйте его.
val list2 = listOf("a", "bbb", "cc")
println(list2.sum())
⇒ error: none of the following functions can be called with the arguments supplied:
- Если элемент не является чем-то,
Listчто можно просуммировать напрямую, например, строкой, вы можете указать способ суммирования с.sumBy()помощью лямбда-функции, например, суммировать по длине каждой строки. Как мы уже упоминали в предыдущем практическом занятии, имя по умолчанию для аргумента лямбда-функции — [it.здесь] — этоitимя, обозначающее каждый элемент списка по мере его обхода.
val list2 = listOf("a", "bbb", "cc")
println(list2.sumBy { it.length })
⇒ 6
- Списки предоставляют гораздо больше возможностей. Один из способов оценить их функциональность — создать список в IntelliJ IDEA, добавить точку, а затем посмотреть на подсказку автозавершения. Это работает для любого объекта. Попробуйте это со списком.

- Выберите элемент
listIterator()из списка, затем пройдитесь по списку с помощьюforоператора и выведите все элементы, разделенные пробелами.
val list2 = listOf("a", "bbb", "cc")
for (s in list2.listIterator()) {
println("$s ")
}
⇒ a bbb cc
Шаг 2: Попробуйте хэш-карты
Хэш-карты — ещё одна полезная структура данных. Они позволяют хранить значение и дополнительный объект, который можно использовать для ссылки на сохранённые значения. Например, если вам нужно хранить рост всех учеников вашего класса или города, и вам не нужно знать, кто есть кто, вы можете хранить рост в хэш-карте List. Если же вам нужно хранить имя человека, вы можете использовать имя в качестве ключа, а рост — в качестве значения. В Kotlin можно создавать хэш-карты, которые связывают (или отображают) практически всё с чем угодно, используя хэш-карты hashMapOf(). Хэш-карты представляют собой список пар, где первое значение выступает в качестве ключа поиска для второго значения.
- Создайте хеш-таблицу, которая сопоставляет общепринятые названия рыб (ключи) и научные названия этих рыб (значения).
val scientific = hashMapOf("guppy" to "poecilia reticulata", "catfish" to "corydoras", "zebra fish" to "danio rerio" )
- Затем вы можете получить значение научного названия на основе общепринятого ключа названий рыб, используя
get()квадратные скобки или даже более короткие[].
println (scientific.get("guppy"))
⇒ poecilia reticulata
println(scientific.get("zebra fish"))
⇒ danio rerio
- Попробуйте указать название рыбы, которого нет на карте.
println("scientific.get("swordtail"")
⇒ null
Если ключ отсутствует в карте, попытка вернуть соответствующее научное название приводит к ошибке null. В зависимости от данных карты, может быть распространенным явлением отсутствие совпадения для возможного ключа. Для таких случаев Kotlin предоставляет соответствующую getOrDefault()функцию.
- Попробуйте найти ключ, для которого нет совпадений, используя
getOrDefault().
println(scientific.getOrDefault("swordtail", "sorry, I don't know"))
⇒ sorry, I don't know
Если вам нужно сделать больше, чем просто вернуть значение, Kotlin предоставляет такую getOrElse()функцию.
- Измените свой код, используя
getOrElse()вместоgetOrDefault().
println(scientific.getOrElse("swordtail") {"sorry, I don't know"})
⇒ sorry, I don't know
{}Вместо возврата простого значения по умолчанию выполняется весь код, заключенный в фигурные скобки . В примере функция elseпросто возвращает строку, но это может быть и более сложная операция, например, поиск веб-страницы с подробным научным описанием и его возврат.
Подобно этому mutableListOf, вы также можете создать карту mutableMapOf. Изменяемая карта позволяет добавлять и удалять элементы. Изменяемая карта означает, что элементы можно изменять, неизменяемая — что их нельзя изменять.