Scala Language
Кортеж
Поиск…
замечания
Почему кортежи ограничены длиной 23?
Кортежи переписываются как объекты компилятором. У компилятора есть доступ к Tuple1
через Tuple22
. Этот произвольный предел был решен разработчиками языка.
Почему количество кортежей подсчитывается от 0?
Tuple0
эквивалентно Unit
.
Создание нового кортежа
Кортеж представляет собой разнородный набор из двух-двадцати двух значений. Кортеж можно определить с помощью круглых скобок. Для кортежей размера 2
(также называемого «парой») есть синтаксис стрелки.
scala> val x = (1, "hello") x: (Int, String) = (1,hello) scala> val y = 2 -> "world" y: (Int, String) = (2,world) scala> val z = 3 → "foo" //example of using U+2192 RIGHTWARD ARROW z: (Int, String) = (3,foo)
x
- кортеж размера два. Чтобы получить доступ к элементам кортежа, используйте ._1
, через ._22
. Например, мы можем использовать x._1
для доступа к первому элементу кортежа x
. x._2
обращается ко второму элементу. Более элегантно, вы можете использовать экстракторы кортежей .
Синтаксис стрелки для создания кортежей размера два в основном используется в Картах, которые представляют собой коллекции (key -> value)
:
scala> val m = Map[Int, String](2 -> "world") m: scala.collection.immutable.Map[Int,String] = Map(2 -> world) scala> m + x res0: scala.collection.immutable.Map[Int,String] = Map(2 -> world, 1 -> hello) scala> (m + x).toList res1: List[(Int, String)] = List((2,world), (1,hello))
Синтаксис для пары на карте - это синтаксис стрелки, дающий понять, что 1 - это ключ, а a - значение, связанное с этим ключом.
Кортежи в коллекциях
Кортежи часто используются в коллекциях, но их нужно обрабатывать определенным образом. Например, учитывая следующий список кортежей:
scala> val l = List(1 -> 2, 2 -> 3, 3 -> 4)
l: List[(Int, Int)] = List((1,2), (2,3), (3,4))
Кажется естественным добавить элементы вместе, используя неявную распаковку:
scala> l.map((e1: Int, e2: Int) => e1 + e2)
Однако это приводит к следующей ошибке:
<console>:9: error: type mismatch;
found : (Int, Int) => Int
required: ((Int, Int)) => ?
l.map((e1: Int, e2: Int) => e1 + e2)
Scala не может неявно распаковать кортежи таким образом. У нас есть две возможности исправить эту карту. Первый заключается в использовании позиционных аксессуаров _1
и _2
:
scala> l.map(e => e._1 + e._2)
res1: List[Int] = List(3, 5, 7)
Другой вариант - использовать оператор case
для распаковки кортежей с использованием сопоставления с образцом:
scala> l.map{ case (e1: Int, e2: Int) => e1 + e2}
res2: List[Int] = List(3, 5, 7)
Эти ограничения применяются для любой функции более высокого порядка, применяемой к набору кортежей.