在xtend中组合集合

问题描述 投票:1回答:2

我有两套:

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

我希望setB包含1,2,3,4,5。

但是,+运算符返回Iterable的实例,而不是Set

是否有任何xtend快捷方式可以让我做我想做的事情?

xtend
2个回答
1
投票

我担心没有支持工会的支持。您可能想要为两套添加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)
}

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返回两个集合的视图,如果底层集合是可变的,则可以更改。

© www.soinside.com 2019 - 2024. All rights reserved.