Ответ 1
Обходной способ заключается в использовании case
:
arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
Я часто работаю со списками, секциями и итераторами кортежей и хотел бы сделать что-то вроде следующего,
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Однако компилятор никогда не согласен с этим синтаксисом. Вместо этого я заканчиваю писать,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Это просто глупо. Как я могу обойти это?
Обходной способ заключается в использовании case
:
arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
Мне нравится функция с чередованием; это как удобно, так и не менее безопасно:
import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
Почему бы вам не использовать
arrayOfTuples.map {t => t._1.toString + t._2 }
Если вам нужны параметры несколько раз, или другой порядок, или во вложенной структуре, где _ не работает,
arrayOfTuples map {case (i, s) => i.toString + s}
кажется короткой, но читаемой формой.
Другой вариант:
arrayOfTuples.map {
t =>
val (e1,e2) = t
e1.toString + e2
}
Обратите внимание, что в Dotty
(основа Scala 3
) расширение параметров было расширено, что позволило использовать следующий синтаксис:
// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")
где каждый _
относится к связанной части кортежа.