scala - source - Código funcional para bucles con salida anticipada.
scala software (3)
¿Qué tal un pliegue?
Nuestra función de alguna manera seudo-costosa:
scala> def divByFive (n: Int) : Option[Int] = {
| println ("processing " + n)
| if (n % 5 == 0) Some (n) else None }
divByFive: (n: Int)Option[Int]
Plegado en una opción:
scala> ((None: Option[Int]) /: (1 to 11)) ((a, b) =>
| if (a != None) a else divByFive (b))
processing 1
processing 2
processing 3
processing 4
processing 5
res69: Option[Int] = Some(5)
¿Cómo puedo refactorizar este código en estilo funcional (scala idiomatic)
def findFirst[T](objects: List[T]):T = {
for (obj <- objects) {
if (expensiveFunc(obj) != null) return obj
}
null.asInstanceOf[T]
}
Esto es casi exactamente lo que hace el método de find
, excepto que devuelve una Option
. Entonces, si desea este comportamiento exacto, puede agregar una llamada a Option.orNull
, como esto:
objects.find(expensiveFunc).orNull
Primero, no use null
en Scala (excepto cuando interactúa con el código Java) sino en Opciones. En segundo lugar, reemplazar los bucles con la recursión. Tercero, eche un vistazo a la rica API de las funciones de Scala, el método que está buscando ya existe como señalado por sepp2k .
Para aprender Puprose tu ejemplo podría ser reescrito como:
def findFirst[T](objects: List[T]):Option[T] = objects match {
case first :: rest if expensiveFunc( first ) != null => Some( first )
case _ :: rest => findFirst( rest )
case Nil => None
}