2011-01-04 4 views
4

Вы знаете, что-то эквивалентно:Что такое java, эквивалентный оператору Single() C#?

<T> T single(List<T> list) { 
    assertEquals(1, list.size()); 
    return list.get(0); 
} 

ли lambdaj содержать что-то подобное?

+2

Для непосвященных вы можете объяснить, что делает оператор single() на C#? – Pushkar

+2

Это метод расширения на 'IEnumerable ', который получает итератор, гарантирует, что итератор возвращает ровно один элемент, а затем возвращает этот элемент вызывающему. – CodesInChaos

+0

@Apache - Я объяснил, что лучше объяснить, чем предоставить образец кода? – ripper234

ответ

1

lambdaj имеет метод selectUnique, который генерирует исключение, если имеется более одного элемента, удовлетворяющего условию, выражаемому данным совпадением. Поскольку у вас нет какого-либо конкретного условия для соответствия, вам нужен Matcher, который всегда возвращает true (мне не кажется, что hamcrest предоставляет такой Matcher из коробки, но его тривиально реализовать), или может быть, вы хотели бы проверить, что (только) объект в списке, по крайней мере, не нулевой, так что вы могли бы достичь этого результата с:

selectUnique(list, Matchers.notNullValue()); 
0

Не совсем то же самое, но Java имеет способ создания списков (и других коллекций), которые гарантированно имеют только один элемент. Взгляните на методы Collections.singleton *. Обратите внимание, что эти коллекции неизменяемы (при входе в конструкции).

+0

Я не хочу генерировать список, я хочу взять существующий список, проверить, что он имеет один элемент, и получить этот элемент. – ripper234

0

Guava имеет способ Iterables.getFirst(), который делает именно это.

+2

Мне кажется, что Iterables.getFirst() не делает то, что задает вопрос (бросает исключение, если список имеет более одного элемента), но он позволяет определить значение по умолчанию, если такой элемент не существует. –

+0

Это первое, а не одно. – ripper234

+0

'Iterables.getOnlyElement' –

-1

Если вы можете использовать мою xpresso библиотеку вы можете написать:

x.list(iterable).toScalar(); 
Смежные вопросы