【问题标题】:Combining Sets in xtend在 xtend 中组合集合
【发布时间】: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


    【解决方案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)
    }
    

    【讨论】:

      【解决方案2】:

      如果不重新定义运算符,您必须手动将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 返回两个集合的视图,如果基础集合是可变的,则该视图可能会发生变化。

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 1970-01-01
        • 2021-05-26
        • 2011-04-13
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 2016-01-29
        • 2021-03-29
        相关资源
        最近更新 更多