如果我有一個我知道包含單個元素的Set,那麼提取它的最佳方法是什麼?我能想出的最好的是這一點,但它並沒有覺得很常規:從常規集中提取單個值的最佳方式是什麼?
set = [1] as Set
e = set.toList()[0]
assert e == 1
如果我對付列表,我有很多的不錯的方式來獲得元素,沒有這似乎與設置工作:
def list = [1]
e = list[0]
(e) = list
e = list.head()
如果我有一個我知道包含單個元素的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.collect { it }[0]
最後,如果它保證該組只有一個項目:
def e
set.each { e = it }
根本的問題,當然,是Java集提供沒有定義順序(如在the Javadoc提到的),因此沒有得到第n個元素(討論in this question和this one)的能力。因此,任何解決方案總是以某種方式將該集合轉換爲列表。
我的猜測是,前兩個選項中的任何一個都涉及最少的數據複製,因爲它們不需要構造完整的集合列表,但對於單元集合,這應該不是問題。
從1.8開始,有[Collection.find()](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find())方法。 1,比'set.find {true}'有點短使用' – 2015-04-22 13:05:09
由於Java 8,這裏是另一個解決方案,爲Java和Groovy工作:
set.stream().findFirst().get()
即使這個問題是相當古老的,我分享我的只是一個更漂亮的解決方案。
(set as List).first()
(set as List)[0]
如果需要採取空考慮(在此問題的情況下):
(set as List)?.first()
(set as List)?.get(index)
希望它能幫助! :)
'常識的感覺'是一個非常主觀的東西。如果我正在編寫代碼,我會很滿意'set.toList()。first()'。 :-) – 2011-03-04 20:09:36