tutorial source software programming fungicida functional exercises coursera code carro scala functional-programming

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 }