2010-04-07 10 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)) 

Was ich will ist, dass der Ergebnistyp List [(Int, Int, Int)] ist. Der einzige Weg, den ich gefunden habe, ist:Kurzer Weg zu BreakOut zu bestimmten Sammlungsart?

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

Gibt es einen kürzeren Weg?

Antwort

12

Sie können es machen etwas prägnanter durch die Typparameter breakOut lassen vom Rückgabetyp abgeleitet werden:

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

Während Bens ist die richtige Antwort, eine Alternative wäre eine Typ zu verwenden gewesen alias:

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

Ben und oxbow_lakes' Antworten kombinieren, können Sie immer noch ein wenig kürzer werden:

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