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!

Respuestas:



32

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


myFunction(strings.exists { x => customPredicate(x) })

14

¡Aún más fácil!

strings contains myString

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)

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.


-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)
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.