Каков наилучший способ извлечь одно значение из набора в 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()