Распаковка кортежей в операциях с картами - PullRequest
70 голосов
/ 02 августа 2011

Я часто работаю со списками, последовательностями и итераторами кортежей и хотел бы сделать что-то вроде следующего:

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 
}

Что просто глупо.Как я могу обойти это?

Ответы [ 5 ]

118 голосов
/ 02 августа 2011

Обходной путь должен использовать case:

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
29 голосов
/ 02 августа 2011

мне нравится функция tupled; это и удобно, и не в последнюю очередь, введите safe:

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
15 голосов
/ 02 августа 2011

Почему бы вам не использовать

arrayOfTuples.map {t => t._1.toString + t._2 }

Если вам нужны параметры несколько раз, или в другом порядке, или во вложенной структуре, где _ не работает,

arrayOfTuples map {case (i, s) => i.toString + s} 

кажется короткой, но читаемой формой.

7 голосов
/ 02 августа 2011

Другой вариант -

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}
0 голосов
/ 21 мая 2019

Обратите внимание, что с Dotty (основание Scala 3) параметр unntupling был расширен, разрешив такой синтаксис:

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")

каждый _ относится к соответствующей части кортежа.

...