2010-04-07 13 views
8
scala> val m = Map(1 -> 2) 
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2) 

scala> m.map{case (a, b) => (a+ 1, a+2, a+3)} 
res42: scala.collection.immutable.Iterable[(Int, Int, Int)] = List((2,3,4)) 

Lo que deseo es que el tipo de resultado sea Lista [(Int, Int, Int)]. La única forma que encontré es:manera corta de romper al tipo de colección específico?

scala> m.map{case (a, b) => (a+ 1, a+2, a+3)}(breakOut[Map[_,_], (Int, Int, Int), List[(Int, Int, Int)]]) 
res43: List[(Int, Int, Int)] = List((2,3,4)) 

¿Hay una manera más corta?

Respuesta

12

Puede que sea un poco más conciso dejando que los parámetros de tipo a breakOut inferirse del tipo de retorno:

scala> m.map{case (a, b) => (a+1, a+2, a+3)}(breakOut) : List[(Int, Int, Int)] 
res3: List[(Int, Int, Int)] = List((2,3,4)) 
6

Mientras que Ben es la respuesta correcta, una alternativa habría sido la utilización de un tipo alias:

type I3 = (Int, Int, Int) 
m.map{case (a, b) => (a+ 1, a+2, a+3)}(breakOut[Map[_,_], I3, List[I3]]) 
0

Combinando Ben y oxbow_lakes' respuestas, se puede obtener un poco más corto aún:

type I3 = (Int, Int, Int) 
m.map {case (a, b) ⇒ (a+1, a+2, a+3)}(breakOut): List[I3] 
Cuestiones relacionadas