【发布时间】:2018-09-06 23:58:54
【问题描述】:
我有两套:
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
我有两套:
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
恐怕没有人支持工会。您可能需要为两组添加一个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)
}
【讨论】:
如果不重新定义运算符,您必须手动将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 返回两个集合的视图,如果基础集合是可变的,则该视图可能会发生变化。
【讨论】: