Scala sprawdza, czy element znajduje się na liście

86

Muszę sprawdzić, czy na liście znajduje się ciąg, i wywołać funkcję, która odpowiednio akceptuje wartość logiczną.

Czy można to osiągnąć za pomocą jednej wkładki?

Poniższy kod jest najlepszym, jaki mogłem dostać:

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

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

Jestem pewien, że można to zrobić przy mniejszej ilości kodowania, ale nie wiem jak!

Dario Oddenino
źródło

Odpowiedzi:

124

Po prostu użyj contains

myFunction(strings.contains(myString))
Kim Stebel
źródło
3
Co się stanie, jeśli nie zajmuję się łańcuchem, ale muszę sprawdzić, czy wartość jest jedną z wielu możliwych dopasowań?
tutuca
2
@tutuca, sprawdź, czy wartości-na-liście-jest-częścią-ciągu .
Om Prakash
32

A jeśli nie chcesz używać ścisłej równości, możesz użyć istnieje:


myFunction(strings.exists { x => customPredicate(x) })
Matt Hughes
źródło
14

Jeszcze łatwiej!

strings contains myString
Taylrl
źródło
4
Czym to się różni od zaakceptowanej odpowiedzi ?
Alper T. Turker
2
Zasadniczo jest taka sama, ale różnice są następujące: 1. Mniej nawiasów 2. Mniej kropek 3. Brak odniesienia do funkcji myFunction 4. Więcej białych znaków. Ogólny; Moja odpowiedź = 25 znaków a zaakceptowana odpowiedź = 38 znaków
Taylrl
To było pytanie retoryczne;) Żeby dać wam kontekst, otrzymałem od LQP . Nie polecałem usuwania, ale jeśli opublikujesz późną odpowiedź, spróbuj podać dodatkową wartość. Odrobina cukru syntaktycznego, nie ma na to ochoty, wiesz. Tylko mówię ...
Alper t. Turker
3
Bez problemów. Rozumiem. Myślę, że to dodaje wartości, pokazując zwiększoną prostotę. Mimo wszystko dzięki :)
Taylrl
3

powinno to działać również z innym predykatem

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
źródło
3
Możesz po prostu użyć egzystencji zamiast użycia find w połączeniu z isDefined
Ciaran0
2

W twoim przypadku rozważyłbym użycie Set, a nie List, aby upewnić się, że masz tylko unikalne wartości. chyba że czasami trzeba dołączyć duplikaty.

W takim przypadku nie musisz dodawać żadnych funkcji opakowujących wokół list.

guykaplan
źródło
-3

Możesz również zaimplementować containsmetodę za pomocą foldLeft, jest całkiem niesamowita. Po prostu uwielbiam algorytmy foldLeft.

Na przykład:

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)
  }
}
Jasio
źródło