在groovy中从Set中提取单个值的最佳方法是什么?

时间:2011-03-04 19:57:38

标签: groovy set

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

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

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

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

4 个答案:

答案 0 :(得分:20)

另一种可能性(可在Java或Groovy中使用):

set.iterator().next()

答案 1 :(得分:15)

一些替代方案,其中没有一个非常漂亮:

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

最后,如果确保该集​​合只有一个项目:

def e
set.each { e = it }

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

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

答案 2 :(得分:1)

从Java 8开始,这是另一个适用于Java和Groovy的解决方案:

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

答案 3 :(得分:1)

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

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

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

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

希望它有所帮助! :)