2015-06-03 48 views
1

這工作時,我試圖映射的情況下,類構造函數對元組的列表:映射元組默認參數

scala> case class MyClas(x:Int, y:String, z:String) 
defined class MyClas 

scala> Seq((1,"hey","you"), (2, "blue","shoe")) map Function.tupled(MyClas) 
res1: Seq[MyClas] = List(MyClas(1,hey,you), MyClas(2,blue,shoe)) 

但是,當有在類的構造函數默認參數:

scala> case class MyClas(x:Int, y:String, z:String, zz:String="blue") 
defined class MyClas 

scala> Seq((1,"hey","you"), (2, "blue","shoe")) map Function.tupled(MyClas) 
<console>:10: error: type mismatch; 
found : MyClas.type 
required: (Int, String, String) => ? 
       Seq((1,"hey","you"), (2, "blue","shoe")) map Function.tupled(MyClas) 

下面的作品,但感覺應該有一個更簡單的方法:

scala> Seq((1,"hey","you"), (2, "blue","shoe")) map Function.tupled((x,y,z)=>MyClas(x,y,z)) 
res3: Seq[MyClas] = List(MyClas(1,hey,you,blue), MyClas(2,blue,shoe,blue)) 

編輯:哦,我忘了澄清這是Scala 2.10.4,但根據@ mohit的評論,這現在在Scala 2.11中有效。有趣。

+1

作品階2.11.6,JAVA 1.7.0_71 。 – mohit

+1

'.map {case(x,y,z)=> MyClas(x,y,z)}'稍微好一點,但我認爲這是最好的。 –

+4

另一種簡化代碼的方法是:'map Function.tupled(MyClas(_,_,_))' – Kolmar

回答

1

你可以添加一個伴侶對象並定義Tuple4和Tuple3一個tupled方法:

case class MyClas(x:Int, y:String, z:String, zz: String = "blue") { 
} 

object MyClas { 
    def tupled(a: (Int, String, String)) = new MyClas(a._1, a._2, a._3) 
    def tupled(a: (Int, String, String, String)) = new MyClas(a._1, a._2, a._3, a._4) 
} 

然後調用它像這樣:

Seq((1, "hey", "you"), (2, "blue", "shoe")).map(MyClas.tupled) 
Seq((1, "hey", "you", "blah"), (2, "blue", "shoe", "blah")).map(MyClas.tupled) 
+0

感謝羅馬人,但我認爲這是比我希望的更多的樣板(反正比匿名函數更重要)。 – JKnight