2015-06-03 3 views
1

Это работает, когда я пытаюсь сопоставить случае конструктор класса со списком кортежей:Mapping против списка Scala кортежей с аргументами по умолчанию

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)) 

Edit: О, я забыл уточнить, что это 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

Вы можете добавить объект компаньоном и определить tupled метод Tuple4 и Tuple3:

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

Смежные вопросы