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


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)
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.