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