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

ata*_*lor 12 groovy set

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

set = [1] as Set
e = set.toList()[0]
assert e == 1
Run Code Online (Sandbox Code Playgroud)

如果我正在处理一个列表,我有很多很好的方法来获取元素,其中没有一个似乎与集合一起使用:

def list = [1]
e = list[0]
(e) = list
e = list.head()
Run Code Online (Sandbox Code Playgroud)

Dón*_*nal 20

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

set.iterator().next()
Run Code Online (Sandbox Code Playgroud)


ig0*_*774 15

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

set.iterator()[0]
set.find { true }
set.collect { it }[0]
Run Code Online (Sandbox Code Playgroud)

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

def e
set.each { e = it }
Run Code Online (Sandbox Code Playgroud)

根本的问题,当然,是Java集提供了没有定义的订单(如中提到的Javadoc),因此没有获得第n个元素(讨论能力,在这个问题上这一个).因此,任何解决方案总是以某种方式将集合转换为列表.

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

  • 从 1.8.1 开始有 [Collection.find()](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find()) 方法,这是使用起来比 `set.find{ true }` 短一点 (2认同)