从 Groovy 中的 Set 中提取单个值的最佳方法是啥?

Posted

技术标签:

【中文标题】从 Groovy 中的 Set 中提取单个值的最佳方法是啥?【英文标题】: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() 感到满意。 :-) 【参考方案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 question 和this 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)

希望对您有所帮助! :)

【讨论】:

以上是关于从 Groovy 中的 Set 中提取单个值的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从提取多个值的列中查询单个值

从时间戳中提取时间分辨率以获取列中特定值的最佳方法是啥?

Jenkins-pipeline 从 groovy 中的属性文件中提取和设置变量

SQL 中的多个聚合从单个值的查询开始

提取groovy jar

NSURL 为参数字符串中的键提取单个值