[FIXED] scala – map & flatten zeigt anderes Ergebnis als flatMap

Ausgabe

val adjList = Map("Logging" -> List("Networking", "Game"))
// val adjList: Map[String, List[String]] = Map(Logging -> List(Networking, Game))

adjList.flatMap { case (v, vs) => vs.map(n => (v, n)) }.toList
// val res7: List[(String, String)] = List((Logging,Game))

adjList.map { case (v, vs) => vs.map(n => (v, n)) }.flatten.toList
// val res8: List[(String, String)] = List((Logging,Networking), (Logging,Game))

Ich bin mir nicht sicher, was hier passiert. Ich habe von beiden das gleiche Ergebnis erwartet.

Lösung

.flatMapist , aber ist . Map_.flatMap.mapIterable.map

Für a Map "Logging" -> "Networking"und "Logging" -> "Game"wird gerade letzteres, "Logging" -> "Game"weil die Schlüssel gleich sind.

val adjList: Map[String, List[String]] = Map("Logging" -> List("Networking", "Game"))
val x0: Map[String, String] = adjList.flatMap { case (v, vs) => vs.map(n => (v, n)) } 
//Map(Logging -> Game)
val x: List[(String, String)] = x0.toList 
//List((Logging,Game))
val adjList: Map[String, List[String]] = Map("Logging" -> List("Networking", "Game"))
val y0: immutable.Iterable[List[(String, String)]] = adjList.map { case (v, vs) => vs.map(n => (v, n)) } 
//List(List((Logging,Networking), (Logging,Game)))
val y1: immutable.Iterable[(String, String)] = y0.flatten
//List((Logging,Networking), (Logging,Game))
val y: List[(String, String)] = y1.toList
//List((Logging,Networking), (Logging,Game))

Auch https://users.scala-lang.org/t/map-flatten-flatmap/4180


Beantwortet von –
Dmytro Mitin


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like