Подтвердить что ты не робот

С Scala Set, существует ли метод, аналогичный методу containsAll в Java Set?

Во время преобразования кода Java в Scala я обнаружил, что существует метод contains для Scala Set, не существует метода containsAll. Я просто пропустил правильное имя метода?

Вот немного кода, с которым я работал, чтобы заполнить пробел, чтобы я мог быстро вернуться к работе. Достаточно ли этого, или я не хватает некоторой тонкости?

  def containsAll[A](set: Set[A], subset: Set[A]): Boolean =
    if (set.size >= subset.size)
      subset.forall(a => set.contains(a))
    else
      false
4b9b3361

Ответ 1

Существует subsetOf, который проверяет, содержатся ли элементы a Set внутри другого Set. (Вид обратного в терминах выражения)

val set = Set(1,2,3,4)
val subset = Set(1,2)

scala> subset.subsetOf(set)
res0: Boolean = true

scala> set.subsetOf(subset)
res1: Boolean = false

Ответ 2

В Scala, Set имеет заданные операции, такие как intersect, таким образом, например,

set.intersect(subset) == subset

передает семантику containsAll, даже если subsetOf, как уже упоминалось, оказывается наиболее кратким.

Ответ 3

Стоит добавить, что вы можете сделать производные вспомогательные методы, например containsAll, доступными на Set[T], если хотите, используя неявный обогащенный класс. Вы также можете рассмотреть возможность переадресации:

implicit class RichSet[T](val x: Set[T]) extends AnyVal {
    def containsAll(y: Set[T]): Boolean = y.subsetOf(x)
    def containsAll(y: T*): Boolean = x.containsAll(y.toSet)
}

Итак, вы можете сделать:

Set(1, 2, 3).containsAll(Set(1, 2))

Или:

Set(1, 2, 3).containsAll(1, 2)