J'ai classe avec champ de type Set[String]
. En outre, j'ai la liste des objets de cette classe. Je voudrais rassembler toutes les chaînes de tous les ensembles de ces objets dans un ensemble. Voici comment je peux déjà le faire:Scala: liste à définir avec flatMap
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)
Il fonctionne, mais je pense, je peux obtenir le même en utilisant uniquement flatMap
, sans toSet
invocation. J'ai essayé, mais il avait donné erreur de compilation:
// 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)
Si je change le type de list
-Set
(à savoir, val list = Set(...)
), alors une telle invocation flatMap
fonctionne.
Alors, puis-je utiliser en quelque sorte Set.canBuildFrom
ou tout autre objet CanBuildFrom
d'invoquer flatMap
sur l'objet List
, de sorte que je vais Set
en conséquence?
Il n'est pas nécessaire d'utiliser 'case' ici car' foldLeft' accepte la fonction avec deux paramètres, à savoir '(_ ++ _.field)' –
vous avez certainement raison @Oleg, mais je l'ai fait explicite juste pour des raisons de clarté. – mdm
vous pouvez toujours omettre le mot-clé "case", puisque vous ne faites pas de correspondance significative –