С 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
Ответы
Ответ 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)