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!

Antworten:



32

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


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

13

Sogar einfacher!

strings contains myString

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)

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.


-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)
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.