Scala vérifie si l'élément est présent dans une liste

86

Je dois vérifier si une chaîne est présente dans une liste et appeler une fonction qui accepte un booléen en conséquence.

Est-il possible d'y parvenir avec une seule ligne?

Le code ci-dessous est le meilleur que je puisse obtenir:

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

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

Je suis sûr qu'il est possible de faire cela avec moins de codage, mais je ne sais pas comment!

Dario Oddenino
la source

Réponses:

32

Et si vous ne souhaitez pas utiliser l'égalité stricte, vous pouvez utiliser existe:


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

Encore plus simple!

strings contains myString
Taylrl
la source
4
En quoi est-ce différent de la réponse acceptée ?
Alper t. Turker
2
C'est fondamentalement la même mais les différences sont: 1. Moins de parenthèses 2. Moins de périodes 3. Pas de référence à myFunction 4. plus d'espace blanc. Global; Ma réponse = 25 caractères vs réponse acceptée = 38 caractères
Taylrl
C'était une question rhétorique;) Pour vous donner un contexte, je suis venu ici de LQP . Je n'ai pas recommandé la suppression, mais si vous postez une réponse tardive, essayez de fournir une valeur supplémentaire. Un peu de sucre syntaxique, ça n'en a pas envie, tu sais. Je dis juste ...
Alper t. Turker
3
Pas de problème. Je comprends. Je pense que cela ajoute de la valeur en montrant une simplicité accrue. Merci quand même :)
Taylrl
3

cela devrait également fonctionner avec un prédicat différent

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
la source
3
Vous pouvez simplement utiliser existe au lieu d'avoir à utiliser find combiné avec isDefined
Ciaran0
2

Dans votre cas, j'envisagerais d'utiliser Set et non List, pour m'assurer que vous n'avez que des valeurs uniques. sauf si vous devez parfois inclure des doublons.

Dans ce cas, vous n'avez pas besoin d'ajouter de fonctions wrapper autour des listes.

guykaplan
la source
-3

Vous pouvez également implémenter une containsméthode avec foldLeft, c'est assez génial. J'adore les algorithmes foldLeft.

Par exemple:

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
la source