Question

Si j'ai quelque chose comme un List[Option[A]] et je veux convertir en un List[A], la méthode standard consiste à utiliser flatMap:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

o => o est juste une fonction d'identité. J'aurais pensé qu'il y aurait une façon de le faire:

l.flatMap(Identity) //return a List[String]

Cependant, je ne peux pas que cela fonctionne comme vous ne pouvez pas generify un object. J'ai essayé quelques petites choses en vain; Quelqu'un at-il quelque chose comme cela fonctionne?

Était-ce utile?

La solution

Il y a une identité dans Predef .

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

A pour expresion est plus agréable, je suppose:

for(x <- l; y <- x) yield y

Modifier

J'ai essayé de comprendre pourquoi le paramètre de type (option [String]) est nécessaire. Le problème semble être la conversion du type de l'option [T] pour Iterable [T].

Si vous définissez la fonction d'identité:

l.flatMap( x => Option.option2Iterable(identity(x)))

le paramètre de type peut être omis.

Autres conseils

FWIW, le Scala 2.8 vous appelez simplement flatten dessus. Thomas est-il la plupart du temps couvert pour Scala 2.7. Il a raté une seule autre façon d'utiliser cette identité:

l.flatMap[String](identity)

Il ne fonctionnera pas avec la notation de l'opérateur, mais (il semble notation de l'opérateur n'accepte pas les paramètres de type, ce qui est bon de savoir).

Vous pouvez aussi Appel flatten sur Scala 2.7 (sur un List, au moins), mais il ne sera pas en mesure de faire quoi que ce soit sans un type. Cependant, cela fonctionne:

l.flatten[String]

Vous pouvez juste donner le type inferencer un peu d'aide:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top