Объединение множеств в xtend - PullRequest
       7

Объединение множеств в xtend

0 голосов
/ 05 сентября 2018

У меня есть два комплекта:

val Set<Integer> setA = #{1, 2, 3}
val Set<Integer> setB = #{3, 4, 5} + setA

Я бы ожидал, что setB будет содержать 1, 2, 3, 4, 5.

Однако оператор + возвращает экземпляр Iterable вместо Set.

Существуют ли какие-либо ярлыки xtend, которые позволили бы мне делать то, что я хочу?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Без переопределения операторов вы должны конвертировать Iterable в Set вручную.

val Set<Integer> setA = #{1, 2, 3}
val Set<Integer> setB = (#{3, 4, 5} + setA).toSet

Если у вас есть изменяемый набор, есть еще один способ: оператор +=, который является ярлыком для addAll в любой коллекции.

val Set<Integer> setA = #{1, 2, 3}
val Set<Integer> setB = newHashSet(3, 4, 5)
setB += setA

Ни одно из решений не выглядит особенно хорошо, и вы, вероятно, хотите избежать изменчивости.

Как предлагается в другом ответе, метод Sets.union в Гуаве может пригодиться, хотя я бы скорее импортировал его как статическое расширение, чем переопределение операторов. Тогда вы можете использовать:

val Set<Integer> setA = #{1, 2, 3}
val Set<Integer> setB = #{3, 4, 5}.union(setA)

Будьте осторожны, union возвращает представление обоих наборов, которое может измениться, если базовые наборы являются изменяемыми.

0 голосов
/ 05 сентября 2018

Боюсь, что нет поддержки в поддержку союза. Вы можете добавить operator_plus для двух комплектов и делегировать Guavas Sets.union.

def <T> Set<? extends T> operator_plus(Set<? extends T> left, Set<? extends T> right) {
  return Sets.union(left, right)
}
...