Какой лучший способ извлечь единственное значение из набора в groovy? - PullRequest
12 голосов
/ 04 марта 2011

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

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

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

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

Ответы [ 4 ]

20 голосов
/ 07 марта 2011

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

set.iterator().next()
15 голосов
/ 04 марта 2011

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

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

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

def e
set.each { e = it }

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

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

1 голос
/ 25 января 2018

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

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

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

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

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

1 голос
/ 28 сентября 2016

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

set.stream().findFirst().get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...