Scala prüft, ob ein Element in einer Liste vorhanden ist

83

Ich muss überprüfen, ob eine Zeichenfolge in einer Liste vorhanden ist, und eine Funktion aufrufen, die einen Booleschen Wert entsprechend akzeptiert.

Ist es möglich, dies mit einem Einzeiler zu erreichen?

Der folgende Code ist der beste, den ich bekommen konnte:

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

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

Ich bin sicher, dass dies mit weniger Codierung möglich ist, aber ich weiß nicht wie!

Dario Oddenino
quelle

Antworten:

120

Benutz einfach contains

myFunction(strings.contains(myString))
Kim Stebel
quelle
3
Was ist, wenn ich mich nicht mit einer Zeichenfolge befasse, sondern prüfen muss, ob ein Wert aus einer Reihe möglicher Übereinstimmungen besteht?
Tutuca
2
@tutuca, überprüfe , ob die Werte in der Liste Teil der Zeichenfolge sind .
Om Prakash
32

Und wenn Sie keine strikte Gleichheit verwenden möchten, können Sie Folgendes verwenden:


myFunction(strings.exists { x => customPredicate(x) })
Matt Hughes
quelle
13

Sogar einfacher!

strings contains myString
Taylrl
quelle
4
Wie unterscheidet sich das von der akzeptierten Antwort ?
Alper t. Turker
2
Es ist im Grunde das gleiche, aber die Unterschiede sind: 1. Weniger Klammern 2. Weniger Perioden 3. Kein Verweis auf myFunction 4. Mehr Leerraum. Insgesamt; Meine Antwort = 25 Zeichen vs Akzeptierte Antwort = 38 Zeichen
Taylrl
Es war eine rhetorische Frage;) Um Ihnen einen Kontext zu geben, den ich hier von LQP erhalten habe . Ich habe das Löschen nicht empfohlen, aber wenn Sie eine verspätete Antwort veröffentlichen, geben Sie einen zusätzlichen Wert an. Ein bisschen syntaktischer Zucker, nach dem es sich nicht anfühlt, weißt du? Ich sage nur ...
Alper t. Turker
3
Keine Probleme. Ich verstehe. Ich denke, es schafft Mehrwert, indem es eine erhöhte Einfachheit zeigt.
Trotzdem
3

Dies sollte auch mit verschiedenen Prädikaten funktionieren

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
quelle
3
Sie könnten nur existierende verwenden, anstatt find in Kombination mit isDefined
Ciaran0 verwenden zu müssen.
2

In Ihrem Fall würde ich die Verwendung von Set und nicht List in Betracht ziehen, um sicherzustellen, dass Sie nur eindeutige Werte haben. es sei denn, Sie müssen manchmal Duplikate einfügen.

In diesem Fall müssen Sie keine Wrapper-Funktionen um Listen hinzufügen.

Guykaplan
quelle
-2

Sie können auch eine containsMethode mit implementierenfoldLeft , es ist ziemlich genial. Ich liebe FoldLeft-Algorithmen.

Beispielsweise:

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
quelle