Scala 映射操作中的元组解包

Scala 映射操作中的元组解包,scala,map,iterator,tuples,iterable-unpacking,Scala,Map,Iterator,Tuples,Iterable Unpacking,我经常发现自己在使用列表、seq和元组迭代器,并想做如下工作: 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

我经常发现自己在使用列表、seq和元组迭代器,并想做如下工作:

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}
另一个选择是

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}
你为什么不使用

arrayOfTuples.map {t => t._1.toString + t._2 }
如果需要多次或不同顺序的参数,或者需要嵌套结构中的参数,其中u不起作用

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

似乎是一种简短但可读的形式。

我喜欢tuple函数;它既方便又安全:

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

从Scala 3开始,已进行扩展,允许使用以下语法:

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")
其中每个
\uu
按顺序引用关联的元组部分。

我认为这是最自然的解决方案:

for ((e1, e2) <- arrayOfTuples) yield {
  e1.toString + e2
}

for((e1,e2),您甚至不需要键入元组元素=>已经足够好了,元组元素的类型是已知的。我想主要原因是,大多数时候,map函数的处理比
.toString+
复杂得多,他想处理比
t.\u 1
t.\u 2
更容易理解的名称。那么
数组的map{case(I,s)=>i.toString+s}
当然更方便。但是,你应该问你的问题,以得到你需要的答案。:)好吧,正如他所说的“频繁”,我希望它的意思是“在不同的情况下”,我没有看到任何情况下你经常需要
Int+String
映射