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!

Respostas:



32

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


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

14

Ainda mais fácil!

strings contains myString

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)

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.


-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)
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.