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!

Odpowiedzi:



32

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


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

14

Jeszcze łatwiej!

strings contains myString

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)

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.


-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)
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.