Иногда данные используются в группах. Примером может быть пара координат (х, у) на 2D сетке. Аналогично набор координат на 3D сетке состоит из значений x, y и z. В Kotlin для таких данных используются типы Pair
и Triple
.
Содержание статьи
В других языках похожую функцию выполняет тип кортежей.
Типы Pair и Triple в Kotlin
Pair
и Triple
являются типами, которые представляют данные, состоящие из трех или двух значений любого типа. Если вам нужно больше трех значений, требуется использовать data class, который мы рассмотрим в будущих статьях.
Рассмотрим тип Pair
. В качестве примера определим пару 2D координат, где значение каждой оси является целым числом типа Int
:
1 | val coordinates: Pair<Int, Int> = Pair(2, 3) |
Типом константы coordinates
является Pair<Int, Int>
. Тип значений внутри Pair
, в данном случае является Int
, разделяются запятыми и заключаются в <>
. Код для создания Pair
почти такой же, каждое значение разделено запятыми и заключено в круглые скобки.
Вывод типа также может автоматически понять, что это тип Pair
:
1 | val coordinatesInferred = Pair(2, 3) |
Запись можно сделать более краткой, используя оператор to
:
1 | val coordinatesWithTo = 2 to 3 |
Аналогичным образом в Pair
можно поместить значения типа Double
:
1 2 | val coordinatesDoubles = Pair(2.1, 3.5) // Вывод типа будет следующим: Pair<Double, Double> |
Получить доступ к данным внутри Pair
можно так:
1 2 | val x1 = coordinates.first val y1 = coordinates.second |
Можно ссылаться на каждый элемент в Pair
по его положению в паре, начиная с first
. В этом примере x1
будет равен 2
, а y1
будет равен 3
.
В предыдущем примере может не сразу очевидно, что первое значение — это координата x
, а второе значение — координата y
. Это еще один пример того, почему при объявлении переменной важно давать переменным понятные названия.
Kotlin позволяет использовать объявление деструктуризации для отдельных частей Pair
. Таким образом можно четко указать, что из себя представляет каждая часть. К примеру:
1 2 | val (x, y) = coordinates // x и y принадлежат типу Int |
Здесь значения извлекаются из coordinates
и присваиваются к х
и у
.
Triple
работает так же, как и Pair
, только вместо двух значений у нас теперь три.
Если вам нужно одновременно получить доступ к частям данных из Triple
, как в примере выше, можно использовать более простой синтаксис:
1 2 | val coordinates3D = Triple(2, 3, 1) val (x3, y3, z3) = coordinates3D |
Здесь объявляются три новые константы — x3
, y3
и z3
, им присваивается каждая часть из Triple
. Код является эквивалентом следующему:
1 2 3 4 | val coordinates3D = Triple(2, 3, 1) val x3 = coordinates3D.first val y3 = coordinates3D.second val z3 = coordinates3D.third |
Если вам нужно проигнорировать определенный элемент из Pair
или Triple
, можно заменить соответствующую часть объявления подчеркиванием. К примеру, при выполнении 2D вычислений необходимо проигнорировать координату z
из coordinates3D
. Это делается следующим образом:
1 | val (x4, y4, _) = coordinates3D |
Эта строка кода объявляет только х4
и у4
. С помощью специального символа _
игнорируется указанная часть.
Задания для проверки
- Объявите константу
Triple
, которая содержит три значенияInt
. Используйте ее для обозначения даты (месяц, день, год); - Извлеките значения из
Triple
в три константы с названиямиmonth
,day
иyear
; - Через одну строку выведите значения месяца и года в две константы. Вам нужно будет использовать подчеркивание
_
, чтобы проигнорировать день; - Так как значения внутри
Pairs
иTriple
нельзя изменить, нужно извлечь из них значения, внести изменения, а затем создать новуюPair
илиTriple
. Используя значения, извлеченные на третьем шаге, измените значение месяца и создайте новуюPair
, содержащую измененный месяц вместе с не измененным годом.