Scala перевіряє, чи присутній елемент у списку


86

Мені потрібно перевірити, чи є рядок у списку, і викликати функцію, яка відповідно приймає логічне значення.

Чи можливо цього досягти за допомогою одного вкладиша?

Код нижче - найкращий, який я міг отримати:

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

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

Я впевнений, що це можна зробити з меншим кодуванням, але я не знаю як!

Відповіді:


124

Просто використовуйте contains

myFunction(strings.contains(myString))

3
Що робити, якщо я не маю справи з рядком, але мені потрібно перевірити, чи відповідає якесь значення з числа можливих збігів?
Тутука


32

І якщо ви не хочете використовувати сувору рівність, ви можете використовувати існує:


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

14

Ще простіше!

strings contains myString

4
Чим це відрізняється від прийнятої відповіді ?
Альпер т. Turker

2
Це принципово однаково, але відмінності: 1. Менше дужок 2. Менше періодів 3. Немає посилання на myFunction 4. більше пробілів. Загалом; Моя відповідь = 25 символів проти Прийнята відповідь = 38 символів
Taylrl

Це було риторичне запитання;) Щоб дати вам контекст, який я отримав тут від LQP . Я не рекомендував видаляти, але якщо ви надішлете пізню відповідь, спробуйте надати додаткове значення. Зрозуміло, трохи синтаксичного цукру. Тільки кажу ...
Альпер т. Turker

3
Немає проблем. Я розумію. Я думаю, це додає ваги, демонструючи підвищену простоту. Хоча все одно дякую :)
Taylrl

3

це також має працювати з різними присудками

myFunction(strings.find( _ == mystring ).isDefined)

3
Ви можете просто використовувати існує, замість того, щоб використовувати find у поєднанні з isDefined
Ciaran0 07

2

У вашому випадку я б розглянув використання Set, а не List, щоб переконатися, що у вас є лише унікальні значення. окрім випадків, коли потрібно іноді включати дублікати.

У цьому випадку вам не потрібно додавати будь-які функції обгортки навколо списків.


-3

Ви також можете реалізувати containsметод за допомогоюfoldLeft , це досить приголомшливо. Я просто люблю алгоритми foldLeft.

Наприклад:

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)
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.