2016-11-10 1 views
2

Ich möchte etwas implementieren, wie:Wie wählt man den Ausgabesammeltyp in Seq.map aus?

def f(s: Seq[Int]): Vector[String] = s.map(_.toString).toVector 

Aber ich würde es direkt die Ausgabe Vector erstellen möchten, ohne die map Ausführung zuerst, so dass, was auch immer Seq, bevor es in einen Vektor zu kopieren.

Seq.map nimmt eine implizite canBuilFrom Parameter, die die Sammlungsausgabetyp induziert. Also habe ich versucht s.map(...)(Vector.canBuildFrom[String]), die den Fehler verursacht:

found : scala.collection.generic.CanBuildFrom[Vector.Coll,String,scala.collection.immutable.Vector[String]] 
(which expands to) scala.collection.generic.CanBuildFrom[scala.collection.immutable.Vector[_],String,scala.collection.immutable.Vector[String]] 
required: scala.collection.generic.CanBuildFrom[Seq[Int],String,Vector[String]] 
     def f(s: Seq[Int]): Vector[String] = s.map(_.toString)(Vector.canBuildFrom[String]) 

Im Grunde ist es folgern, nicht korrekt die erste Art Argument der CanBuildFrom

Wie das getan werden kann?

Antwort

4

breakOut ist das, was Sie suchen

def f(s: Seq[Int]): Vector[String] = s.map(_.toString)(collection.breakOut) 

Für eine eingehende Diskussion darüber, was breakOut hat, lesen Sie in dieser Frage Stackoverflow: Scala 2.8 breakOut

+0

Ich würde es bis-Abstimmung zweimal, wenn ich könnte . Es ist so einfach zu verwenden, dass ich jetzt 'collection.breakout' über den gesamten Code habe :-) –

+0

@Juh_ Gern geschehen! Warum haben Sie dann die akzeptierte Markierung aus der Antwort entfernt? Versuchen Sie es zweimal zu verbessern? :) –

+0

Entschuldigung. Ich habe nicht bemerkt, dass ich es entfernt habe. –

Verwandte Themen