xtend中的组合集

时间:2018-09-04 21:52:05

标签: xtend

我有两组:

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 :(得分:1)

恐怕没有支持工会的支持。您可能要为两个集合添加一个operator_plus并委托给番石榴Sets.union

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

答案 1 :(得分:0)

没有重新定义运算符,您必须手动将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

这两种解决方案看起来都不是特别好,您可能要避免可变性。

正如另一个答案中所建议的那样,虽然我宁愿将其作为静态扩展而不是重新定义运算符,但Guava的Sets.union方法可能会派上用场。然后您可以使用:

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

但是请注意,union返回两个集合的 view ,如果基础集合是可变的,则可以更改。