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.