Каков наилучший способ извлечь одно значение из набора в groovy?

Если у меня есть набор, который, как я знаю, содержит один элемент, какой лучший способ его извлечь? Лучшее, что я могу придумать, это, но он не очень чувствует себя groovy:

set = [1] as Set
e = set.toList()[0]
assert e == 1

Если я имею дело со списком, у меня есть много хороших способов получить элемент, ни один из которых, похоже, не работает с Sets:

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

Ответ 1

Несколько альтернатив, ни одна из них очень красивая:

set.iterator()[0]
set.find { true }
set.collect { it }[0]

Наконец, если он гарантирует, что этот набор имеет только один элемент:

def e
set.each { e = it }

Основная проблема, конечно же, в том, что Java Sets не обеспечивают определенного порядка (как указано в Javadoc), и, следовательно, никакой способности получить n-й элемент (обсуждаемый в этом вопросе и этот). Следовательно, любое решение всегда должно каким-то образом преобразовать набор в список.

Я предполагаю, что один из первых двух вариантов включает в себя наименьшее копирование данных, поскольку они не должны содержать полный список набора, но для одноэлементного набора это вряд ли вызывает беспокойство.

Ответ 2

Еще одна возможность (которая будет работать на Java или Groovy):

set.iterator().next()

Ответ 3

Даже когда этот вопрос довольно старый, я делюсь своим чуть более красивым решением.

(set as List).first()
(set as List)[0]

Если вам нужно принять во внимание (не в этом вопросе):

(set as List)?.first()
(set as List)?.get(index)

Надеюсь, это поможет!:)

Ответ 4

Так как Java 8, вот еще одно решение, которое будет работать как для Java, так и для Groovy:

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