Supongamos que tengo un Option[A => Boolean]
, un List[A]
, y algún conjunto de operaciones que deseo realizar en un subconjunto de esa lista. Si la opción está configurada, entonces quiero filtrar la lista primero y luego aplicar mis operaciones. Si no, entonces quiero aplicarlo en la lista completa. Un ejemplo:Filtrar condicionalmente una secuencia
val a : Option[Int => Boolean] = Option((a : Int) => a % 2 == 0)
val b = 1 to 100
que fácilmente puede hacer lo siguiente:
val c = if (a.isDefined) b.filter(a.get) else b
Sin embargo, esto implica llamar a.get
; ¡Muchos condicionamientos me dejan incapaz de hacer esto! alternativamente, que podía hacer:
val c = b.filter(a.getOrElse(_ => true))
Esto se siente mejor, pero ahora estoy atascado con un segundo (aunque trivial) operación que se lleva a cabo para cada elemento de mi secuencia. Espero que se optimice, pero esto todavía se siente imperfecto.
Lo que me gustaría es algo que no tenga ninguno de los defectos. Parece que debería haber una buena manera de hacerlo, ¿alguna idea?
Sí; por alguna razón, no veía la idea de cambiar la situación. Esto es muy ordenado. – Submonoid
Sin embargo, una razón más por la que el patrón "option.map(). GetOrElse()" debe agregarse a la biblioteca estándar. Siempre es una de las primeras cosas que propongo. –
@DaveGriffith - De hecho. Lo tengo también, llamado 'fold' (como Scalaz), con la sintaxis' o.map (f) .getOrElse (b) 'convirtiéndose en' o.fold (b) (f) '. –