2009-03-19 5 views

Répondre

14

Dans le cas où it est un Iterable

val it:Iterable[Option[T]] = ... 
it.flatMap(x => x)    //returns an Iterable[T] 

Dans le cas où it est un Iterator

val it:Iterator[Option[T]] = ... 
it.flatMap(x => x elements)  //returns an Iterator[T] 
it.flatMap(_ elements)    //equivalent 
+0

En sachant qui vous êtes (à partir de la liste de diffusion scala-user), vous avez raison j'en suis sûr (je n'ai pas accès à mon environnement de développement Scala en ce moment :-). Pouvez-vous expliquer un peu comment cela fonctionne. Je promets que je ne suis pas un idiot mais je n'ai aucune idée de comment je serais censé obtenir cela du scaladoc –

+0

Ne serait-ce pas "it flatMap {_ elements}"? (J'ai encore lu le scaladoc!) –

+1

Ce serait génial de voir plus de gourous Scala sur StackOverflow. La liste de diffusion scala-user remplit ma boîte de réception avec des arcanes sur break/continue :-) –

10

Dans les nouvelles versions cela est désormais possible:

val it: Iterator[Option[T]] = ... 
val flatIt = it.flatten 
+1

Eh bien oui, maintenant vous le feriez. Lorsque la question a été posée et répondue, cela n'a pas fonctionné. (Au cas où vous ne pourriez pas le dire, votre utilisation du mot «simple» implique que les commentateurs précédents ont réussi à ignorer la réponse directe. – extempore

+0

@extempore: Vous avez raison. J'ai corrigé mon commentaire. – soc

5

Cette travaille pour moi (Scala 2.8):

it.collect {case Some(s) => s} 
3

Pour moi, c'est un cas d'utilisation classique pour l'interface utilisateur monadique.

for { 
    opt <- iterable 
    t <- opt 
} yield t 

Il est juste de sucre pour la solution flatMap décrite ci-dessus, et il produit bytecode identiques. Cependant, la syntaxe est importante, et je pense que l'un des meilleurs moments pour utiliser la syntaxe monadique for de Scala est quand vous travaillez avec, particulièrement en conjonction avec des collections.

Je pense que cette formulation est considérablement plus lisible, en particulier pour ceux qui ne sont pas très familiers avec la programmation fonctionnelle. J'essaie souvent à la fois les expressions monadiques et fonctionnelles d'une boucle et vois ce qui me semble plus simple. Je pense que flatMap est un nom difficile pour la plupart des gens à grok (et en fait, l'appeler >>= me semble plus intuitif).

Questions connexes