2011-08-01 24 views
60

我经常发现自己使用列表,Seqs,和元组的迭代工作,希望做类似下面元组地图操作开箱

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 
} 

这是愚蠢的。我怎样才能解决这个问题?

回答

99

一个解决方法是使用case

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

正是我所需要的! – duckworthd

+23

而且你甚至不需要输入元组元素。 case(e1,e2)=>足够好,元组元素的类型是已知的。 –

7

另一种选择是

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

这只是[接受的答案](https://stackoverflow.com/a/6905231/833844)的可读性较差的形式。 –

11

你为什么不使用

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

如果您需要的参数多的时间,或不同的顺序,或嵌套结构,其中_不起作用,

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

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

+0

我想主要的原因是大多数时候,map函数的处理比'_.toString + _'复杂得多,他想操作比t._1和t._2更容易理解的名字'。 – Nicolas

+0

那么'arrayOfTuples map {case(i,s)=> i.toString + s}'当然更方便。但是,您应该提出您的问题,以获得您需要的答案。 :) –

+0

好吧,正如他所说的“经常”,我希望这意味着“在不同的情况下”,我没有看到任何经常需要“Int + String”映射的场景。 ;) – Nicolas

23

我喜欢tupled函数;它既方便又不是不重要,型号安全:

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