什么';在groovy中,从集合中提取单个值的最佳方法是什么?

什么';在groovy中,从集合中提取单个值的最佳方法是什么?,groovy,set,Groovy,Set,如果我知道一个集合包含一个元素,那么提取它的最佳方法是什么?我能想到的最好的办法是这样,但感觉不太好: set = [1] as Set e = set.toList()[0] assert e == 1 如果我在处理一个列表,我有很多很好的方法来获取元素,但没有一种方法可以处理集合: def list = [1] e = list[0] (e) = list e = list.head() 有几个选择,没有一个很漂亮: set.iterator()[0] set.find { true }

如果我知道一个集合包含一个元素,那么提取它的最佳方法是什么?我能想到的最好的办法是这样,但感觉不太好:

set = [1] as Set
e = set.toList()[0]
assert e == 1
如果我在处理一个列表,我有很多很好的方法来获取元素,但没有一种方法可以处理集合:

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

有几个选择,没有一个很漂亮:

set.iterator()[0]
set.find { true }
set.collect { it }[0]
最后,如果保证该集合只有一项:

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

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

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


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

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

即使这个问题已经很老了,我也在分享我的稍微漂亮一点的解决方案

(set as List).first()
(set as List)[0]
如果您需要考虑null(不是本问题中的情况):


希望有帮助!:)

“groovy feel”是一个非常主观的东西。如果我正在编写代码,我会很高兴使用
set.toList().first()
:-)从1.8.1开始就有一个方法,它比
set.find{true}
(set as List).first()
(set as List)[0]
(set as List)?.first()
(set as List)?.get(index)