Scala verifica se o elemento está presente em uma lista

86

Preciso verificar se uma string está presente em uma lista e chamar uma função que aceita um booleano de acordo.

É possível conseguir isso com um liner?

O código abaixo é o melhor que consegui:

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

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

Tenho certeza que é possível fazer isso com menos codificação, mas não sei como!

Dario Oddenino
fonte

Respostas:

124

Apenas use contains

myFunction(strings.contains(myString))
Kim Stebel
fonte
3
E se eu não lidar com uma string, mas precisar verificar se um valor é qualquer uma das várias correspondências possíveis?
tutuca de
2
@tutuca, verifique esta verificação se os valores na lista são parte da string .
Om Prakash,
32

E se você não quiser usar igualdade estrita, pode usar existe:


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

Ainda mais fácil!

strings contains myString
Taylrl
fonte
4
Como isso difere da resposta aceita ?
Alper t. Turker
2
É fundamentalmente o mesmo, mas as diferenças são: 1. Menos colchetes 2. Menos pontos 3. Nenhuma referência a myFunction 4. Mais espaço em branco. No geral; Minha resposta = 25 caracteres vs resposta aceita = 38 caracteres
Taylrl
Foi uma pergunta retórica;) Para dar um contexto que obtive aqui do LQP . Eu não recomendei a exclusão, mas se você postar uma resposta tardia, tente fornecer algum valor adicional. Um pouco de açúcar sintático, não dá vontade, sabe. Apenas dizendo ...
Alper t. Turker
3
Sem problemas. Compreendo. Acho que agrega valor ao mostrar maior simplicidade. De qualquer forma, obrigado :)
Taylrl
3

isso deve funcionar também com diferentes predicados

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
fonte
3
Você poderia apenas usar
existing em
2

No seu caso, eu consideraria usar Set e não List, para garantir que você tenha apenas valores únicos. a menos que você às vezes precise incluir duplicatas.

Nesse caso, você não precisa adicionar nenhuma função de wrapper nas listas.

Guykaplan
fonte
-3

Você também pode implementar um containsmétodo comfoldLeft , é incrível. Eu adoro algoritmos foldLeft.

Por exemplo:

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
fonte