Ich habe Klasse mit Feld des Typs Set[String]
. Außerdem habe ich eine Liste von Objekten dieser Klasse. Ich möchte alle Zeichenfolgen aus allen Mengen dieser Objekte in einem Satz sammeln. Hier ist, wie ich es schon tun können:Scala: Liste mit FlatMap setzen
case class MyClass(field: Set[String])
val list = List(
MyClass(Set("123")),
MyClass(Set("456", "798")),
MyClass(Set("123", "798"))
)
list.flatMap(_.field).toSet // Set(123, 456, 798)
Es funktioniert, aber ich denke, ich kann das gleiche mit nur flatMap
, ohne toSet
Aufruf erreichen. Ich habe versucht, diese, aber es war Kompilierungsfehler gegeben:
// error: Cannot construct a collection of type Set[String]
// with elements of type String based on a collection of type List[MyClass].
list.flatMap[String, Set[String]](_.field)
Wenn ich Art von list
-Set
ändern (das heißt, val list = Set(...)
), dann solche flatMap
Aufruf funktioniert.
Also, kann ich irgendwie Set.canBuildFrom
oder andere CanBuildFrom
Objekt flatMap
auf List
Objekt aufzurufen, so dass ich Set
als Ergebnis zu bekommen?
Es ist nicht notwendig, 'case' hier zu verwenden, da' foldLeft' die Funktion akzeptiert zwei Parameter, d. h. '(_ ++ _.field)' –
Sie sind sicherlich richtig @Oleg, aber ich habe es nur aus Gründen der Klarheit explizit gemacht. – mdm
Sie können immer noch das Schlüsselwort "case" weglassen, da Sie keinen signifikanten Mustervergleich durchführen –