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
Что, если я не имею дело со строкой, но мне нужно проверить, является ли значение одним из множества возможных совпадений?
tutuca
2
@tutuca, проверьте это проверка-значения-в-списке-частью-строки .
Ом Пракаш,
32

И если вы не хотите использовать строгое равенство, вы можете использовать exists:


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
Вы могли бы просто использовать exists вместо того, чтобы использовать find в сочетании с isDefined
Ciaran0
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)
  }
}
Джонни
источник