Scala comprueba si el elemento está presente en una lista

86

Necesito verificar si una cadena está presente en una lista y llamar a una función que acepte un booleano en consecuencia.

¿Es posible lograr esto con una sola línea?

El siguiente código es el mejor que pude obtener:

val strings = List("a", "b", "c")
val myString = "a"

strings.find(x=>x == myString) match {
  case Some(_) => myFunction(true)
  case None => myFunction(false)
}

Estoy seguro de que es posible hacer esto con menos codificación, ¡pero no sé cómo!

Dario Oddenino
fuente

Respuestas:

32

Y si no desea utilizar la igualdad estricta, puede utilizar existe:


myFunction(strings.exists { x => customPredicate(x) })
Matt Hughes
fuente
14

¡Aún más fácil!

strings contains myString
Taylrl
fuente
4
¿En qué se diferencia eso de la respuesta aceptada ?
Alper t. Turker
2
Es fundamentalmente lo mismo, pero las diferencias son: 1. Menos corchetes 2. Menos períodos 3. Sin referencia a myFunction 4. Más espacio en blanco. En general; Mi respuesta = 25 caracteres frente a la respuesta aceptada = 38 caracteres
Taylrl
Fue una pregunta retórica;) Para darles un contexto, obtuve aquí de LQP . No recomendé la eliminación, pero si publica una respuesta tardía, intente proporcionar algún valor adicional. Un poco de azúcar sintáctico no se siente así, ya sabes. Solo digo ...
Alper t. Turker
3
No hay problemas. Entiendo. Creo que agrega valor al mostrar una mayor simplicidad. Gracias de todos modos :)
Taylrl
3

esto debería funcionar también con diferentes predicados

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
fuente
3
Puede usar existe en lugar de tener que usar buscar combinado con isDefined
Ciaran0
2

En su caso, consideraría usar Set y no List, para asegurarme de que solo tiene valores únicos. a menos que a veces necesite incluir duplicados.

En este caso, no es necesario agregar funciones contenedoras en las listas.

Guykaplan
fuente
-3

También puedes implementar un containsmétodo con foldLeft, es bastante impresionante. Me encantan los algoritmos foldLeft.

Por ejemplo:

object ContainsWithFoldLeft extends App {

  val list = (0 to 10).toList
  println(contains(list, 10)) //true
  println(contains(list, 11)) //false

  def contains[A](list: List[A], item: A): Boolean = {
    list.foldLeft(false)((r, c) => c.equals(item) || r)
  }
}
Johnny
fuente