Carte aplatir et flatmap pas d'équivalent
Je pensais que Scala construction map(f).aplatir
est équivalent à flatMap(f)
. Mais avec cet exemple, il n'est pas le cas. Je me demande quel est le rôle de la classe de cas. Si je utiliser les nombres entiers, les deux sont équivalents. Mais dans mon cas, je ne peux pas.
case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0, 3), CTest(1) -> List(0, 2)))
val possibilities = s flatMap { m =>
val mapping = m flatMap {
case (label, destNodes) => destNodes map {
case nodes => (label, nodes) }
}
mapping
}
possibilities
Rendements
Set((CTest(0),3), (CTest(1), 2))
alors que
case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0, 3), CTest(1) -> List(0, 2)))
val possibilities = s flatMap { m =>
val mapping = m map {
case (label, destNodes) => destNodes map {
case nodes => (label, nodes) }
}
mapping.flatten
}
possibilities
rendements
Set((CTest(0),0), (CTest(0),3), (CTest(1),0), (CTest(1),2))
Aucune idée pourquoi?
OriginalL'auteur Mikaël Mayer | 2013-11-26
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à la mise en œuvre de
flatMap
:Résultat de
flatMap
dépend collection originale type et le type de résultat de la fonctionf
. Dans le premier exemple, vous générez de la séquence des n-uplets de la carte, de sorte que le compilateur choisit de mise en œuvre commeCanBuildFrom[Map[A, B], (C, D), Map[C, D]]
, qui fournit builder pourMap
, qui provoque l'écrasement des mêmes touches.Vous pouvez convertir directement la carte à la plaine de itératif, qui donnera le résultat que vous souhaitez:
OriginalL'auteur chemikadze
Cela se produit en raison d'un niveau intermédiaire de structures de données.
Je vais prendre la version simple de votre exemple.
Lors de l'utilisation de
flatMap
vous de créer directement unMap[CTest, Int]
Ici, en raison de l'unicité des clés de
Map
,(CTest(0), 0)
et(CTest(1), 0)
seront supprimées à partir du résultat. lorsque vousflatMap
fil du jeu, vous obtiendrez unSet
deTuples
qui étaient dans laMap
.Dans votre deuxième exemple, la carte et les aplatir.
Il n'est pas tout
Map
ou d'une autre singularité conservé la structure de données créée dans le milieu du processus. De sorte que les valeurs ne sont pas abandonnées.OriginalL'auteur tiran