8 Stimmen

Kurzer Weg zum BreakOut zu einem bestimmten Sammlungstyp?

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

Ich möchte, dass der Ergebnistyp List[(Int, Int, Int)] ist. Der einzige Weg, den ich gefunden habe, ist:

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?

12voto

Ben Lings Punkte 28080

Sie können das Ganze etwas prägnanter gestalten, indem Sie die Typparameter an breakOut aus dem 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))

6voto

oxbow_lakes Punkte 131223

Die von Ben gegebene Antwort ist zwar richtig, aber eine Alternative wäre die Verwendung eines Typ-Alias :

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

0voto

DNA Punkte 40967

Wenn man die Antworten von Ben und oxbow_lakes kombiniert, kann man noch etwas kürzer werden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X