【问题标题】:What's the best way to extract a single value from a Set in groovy?从 Groovy 中的 Set 中提取单个值的最佳方法是什么?
【发布时间】:2011-07-09 02:06:52
【问题描述】:

如果我有一个我知道包含单个元素的 Set,那么提取它的最佳方法是什么?我能想到的最好的就是这个,但感觉不是很时髦:

set = [1] as Set
e = set.toList()[0]
assert e == 1

如果我正在处理一个列表,我有很多很好的方法来获取元素,但似乎都不适用于 Sets:

def list = [1]
e = list[0]
(e) = list
e = list.head()

【问题讨论】:

  • “时髦的感觉”是一个非常主观的东西。如果我正在编写代码,我会对set.toList().first() 感到满意。 :-)

标签: groovy set


【解决方案1】:

另一种可能性(适用于 Java 或 Groovy):

set.iterator().next()

【讨论】:

    【解决方案2】:

    一些替代品,它们都不是很漂亮:

    set.iterator()[0]
    set.find { true }
    set.collect { it }[0]
    

    最后,如果保证该集合只有一项:

    def e
    set.each { e = it }
    

    当然,根本问题是 Java Set 没有提供定义的顺序(如the Javadoc 中所述),因此无法获取第 n 个元素(讨论过in this questionthis one)。因此,任何解决方案总是以某种方式将集合转换为列表。

    我的猜测是,前两个选项中的任何一个都涉及最少的数据复制,因为它们不需要构建集合的完整列表,但对于单元素集合,这几乎不是问题。

    【讨论】:

    • 从1.8.1开始就有Collection.find()方法,使用起来比set.find{ true }短一点
    【解决方案3】:

    自 Java 8 以来,这是另一个适用于 Java 和 Groovy 的解决方案:

    set.stream().findFirst().get()
    

    【讨论】:

      【解决方案4】:

      即使这个问题已经很老了,我也会分享我的一个更漂亮的解决方案。

      (set as List).first()
      (set as List)[0]
      

      如果你需要考虑 null (不是这个问题的情况):

      (set as List)?.first()
      (set as List)?.get(index)
      

      希望对您有所帮助! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 2011-03-22
        相关资源
        最近更新 更多