scala scala-2.8

¿Cómo encontrar un elemento coincidente en una lista y asignarlo como un método de API de Scala?



scala-2.8 (4)

¿Qué hay de usar recoger?

// Returns List(66) List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 }

Sin embargo, eso devolverá todos los partidos y no solo el primero.

La mejor respuesta hubiera sido, basada en Scala 2.9:

// Returns Some(66) List(1, 2, 3) collectFirst { case i if (i * 33 % 2 == 0) => i * 33 }

Me temo que la solución sugerida en los comentarios para agregar una head para obtener una versión Scala 2.8 de eso no es muy eficiente. Tal vez en ese caso me atendría a su propio código. En cualquier caso, para asegurarse de que devuelve una opción, no debe llamar a head , sino a headOption .

// Returns Some(66) List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 } headOption

¿Hay un método para hacer lo siguiente sin hacer ambos métodos: find y map ?

val l = 0 to 3 l.find(_ * 33 % 2 == 0).map(_ * 33) // returns Some(66)


Esto lo puede hacer, pero sería más fácil si nos diera cuenta de lo que realmente está tratando de lograr:

l.flatMap(n => if (n * 33 % 2 == 0) Some(n * 33) else None).headOption


Hey mira, es mi pequeño amigo encontrar findMap otra vez!

/** * Finds the first element in the list that satisfies the partial function, then * maps it through the function. */ def findMap[A,B](in: Traversable[A])(f: PartialFunction[A,B]): Option[B] = { in.find(f.isDefinedAt(_)).map(f(_)) }

Tenga en cuenta que, a diferencia de la respuesta aceptada, pero como el método collectFirst mencionado en uno de sus comentarios, este tipo se detiene tan pronto como encuentra un elemento coincidente.


Si no desea realizar su operación map() varias veces (por ejemplo, si es una búsqueda de base de datos costosa) puede hacer esto:

l.view.map(_ * 33).find(_ % 2 == 0)

La view hace que la recopilación sea perezosa, por lo que el número de operaciones map() se minimiza.