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!
A jeśli nie chcesz używać ścisłej równości, możesz użyć istnieje:
źródło
Jeszcze łatwiej!
źródło
powinno to działać również z innym predykatem
źródło
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.
źródło
Możesz również zaimplementować
contains
metodę 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) } }
źródło