2009-03-19 17 views

Respuesta

14

En el caso en que it es un Iterable

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

En el caso en que it es un Iterator

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

Saber quién eres (de la lista de correo scala-usuario), tienes razón Estoy seguro (no tienen acceso a mi ENVT dev Scala en el momento :-). ¿Puedes explicarme un poco cómo funciona esto? Prometo que no soy un idiota pero no tengo ni idea de cómo se supone que debería obtener esto del scaladoc –

+0

¿No sería "flatMap {_ elements}"? (¡He leído el scaladoc otra vez!) –

+1

Sería genial ver más gurús de Scala en StackOverflow. La lista de correo de scala-usuario está llenando mi bandeja de entrada con arcanas discusiones sobre break/continue :-) –

10

En las nuevas versiones esto es ahora posible:

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

Bueno, sí, AHORA lo harías. Cuando la pregunta fue hecha y respondida, eso no funcionó. (En caso de que no pueda decirlo, su uso de la palabra "simple" conlleva la implicación de que los participantes anteriores lograron pasar por alto la respuesta directa.) – extempore

+0

@extempore: Tienes razón. Arreglé mi comentario – soc

5

Este funciona para mí (Scala 2.8):

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

Para mí, este es un caso de uso clásico para la interfaz de usuario monádica.

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

Es sólo azúcar para la solución flatMap descrito anteriormente, y produce código de bytes idénticos. Sin embargo, la sintaxis es importante, y creo que uno de los mejores momentos para usar la sintaxis monádica for de Scala es cuando trabajas con Option, especialmente en conjunto con las colecciones.

creo que esta formulación es considerablemente más fácil de leer, especialmente para aquellos que no están muy familiarizados con la programación funcional. A menudo pruebo las expresiones monádica y funcional de un ciclo y veo que parece más directo. Creo flatMap es nombre difícil para la mayoría de la gente asimilar (y, de hecho, que calificó de >>= tiene sentido más intuitivo para mí).

Cuestiones relacionadas