2016-12-07 4 views
-2

Je vais vérifier si j'ai bien compris les fonctions flatten et flatMap.flatten et flatMap dans scala

1) Ai-je raison de ne pas aplatir les œuvres seulement lorsqu'une collection constitue d'autres collections. Par exemple, aplatissent travaillerait sur les listes suivantes

//list of lists 
val l1 = List(List(1,1,2,-1,3,1,-4,5), List("a","b")) 

//list of a set, list and map 
val l2 = List(Set(1,2,3), List(4,5,6), Map('a'->"x",'b'->"y")) 

Mais aplatissent ne fonctionnera pas sur la suite

val l3 = List(1,2,3) 
val l4 = List(1,2,3,List('a','b')) 
val s1 = "hello world" 
val m1 = Map('h'->"h", 'e'->"e", 'l'->"l",'o'->"0") 
méthode

« aplatir » créerait une nouvelle liste comprenant tous les éléments en supprimant la hiérarchie. Ainsi, il «aplatit» la collection et ramène tous les éléments au même niveau. 2) 'flatMap' applique d'abord une méthode aux éléments d'une liste, puis aplatit la liste. Comme nous l'avons remarqué ci-dessus, la méthode aplatie fonctionne si les listes ont une hiérarchie (contiennent d'autres collections). Il est donc important que la méthode que nous appliquons aux éléments retourne une collection autrement flatMap ne fonctionnera pas

//we have list of lists 
val l1 = List(List(1,1,2,-1,3,1,-4,5), List("a","b")) 

l1 flatMap(x=>x.toSet) 
res2: List[Any] = List(5, 1, -4, 2, 3, -1, a, b) 

val l2 = List(Set(1,2,3), List(1,5,6), Map('a'->"x",'b'->"y")) 
l2.flatMap(x=>x.toSet) 
res3: List[Any] = List(1, 2, 3, 1, 5, 6, (a,x), (b,y)) 

val s1 = "hello world" 
s1.flatMap(x=>Map(x->x.toString)) 

On remarque que ci-dessus s1.flatten ne fonctionnait pas, mais s1.flatMap a fait. C'est parce que, dans s1.flatMap, nous convertissons les éléments d'une chaîne (caractères) en une carte qui est une collection. Ainsi la chaîne a été convertie en une collection de Maps comme (Carte ('h' -> "h"), Carte ('e' -> "e"), Carte ('l' -> "l"), Carte ('l' -> "l"), Carte ('o' -> "o") ....) Ainsi aplatir va fonctionner maintenant. Notez que la carte créée n'est pas Map ('h' -> "h", 'e' -> "e", 'l' -> "l", ....).

+1

Eh bien .... ouais ... – Dima

+0

Et votre question est? –

+0

La question implicite est 'ai-je compris' aplatir et flatmap correctement? ' –

Répondre

1

Jetez un oeil à la signature complète pour flatten:

def flatten[B](implicit asTraversable: (A) ⇒ GenTraversableOnce[B]): List[B] 

Comme vous pouvez le voir, flatten prend un paramètre implicite. Ce paramètre fournit les règles pour aplatir les types de collection donnés. Si le compilateur ne peut pas trouver une portée implicite, il peut être fourni explicitement.

flatten peut aplatir presque n'importe quoi tant que vous fournissez les règles pour le faire.

0

Flatmap est essentiellement une opération de carte suivie d'une aplatissez