如果我知道包含单个元素的Set,那么提取它的最佳方法是什么?我能想到的最好的就是这个,但它并不觉得非常时髦:
set = [1] as Set
e = set.toList()[0]
assert e == 1
如果我正在处理一个列表,我有很多很好的方法来获取元素,其中任何一个似乎都不适用于集合:
def list = [1]
e = list[0]
(e) = list
e = list.head()
答案 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)
希望它有所帮助! :)