create scala map filter option

create - scala filter



Scala: filtrando una colección de Opciones (2)

Supongamos que tengo una función que comprueba si alguna operación es aplicable a una instancia de A y, en caso afirmativo, devuelve una instancia de B o Ninguna:

def checker[A,B]( a: A ) : Option[B] = ...

Ahora quiero formar una nueva colección que contenga todas las instancias válidas de B, descartando los valores Ninguno. El siguiente código parece hacer el trabajo, pero sin duda hay una mejor manera:

val as = List[A]( a1, a2, a3, ... ) val bs = as .map( (a) => checker(a) ) // List[A] => List[Option[B]] .filter( _.isDefined ) // List[Option[B]] => List[Option[B]] .map( _.get ) // List[Option[B]] => List[B]

¡Gracias!


Esto debería hacerlo:

val bs = as.flatMap(checker)


La respuesta anterior es correcta, pero si puede reescribir el checker , le sugiero que use PartialFunction y collect . PartialFunction es una función de tipo A => B que no es necesaria para todos los valores de A. Aquí hay un ejemplo simple:

scala> List(1, 2, 3, 4, "5") collect {case x : Int => x + 42} res1: List[Int] = List(43, 44, 45, 46)

collect toma una instancia de PartialFunction como argumento y la aplica a todos los elementos de la colección. En nuestro caso, la función está definida solo para Ints y se filtra "5" . Entonces, collect es una combinación de map y filter , que es exactamente tu caso.