Подтвердить что ты не робот

Распаковка пакетов в операциях с картами

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

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 
}

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

4b9b3361

Ответ 1

Обходной способ заключается в использовании case:

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}

Ответ 2

Мне нравится функция с чередованием; это как удобно, так и не менее безопасно:

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }

Ответ 3

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

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

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

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

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

Ответ 4

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

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}

Ответ 5

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

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

где каждый _ относится к связанной части кортежа.