Просто в дополнение к другим ответам (я собирался написать что-то вроде @daveb, который удалил свой: Если нет точно одного элемента, то Iterables#getOnlyElement
выдаст IllegalArgumentException
или NoSuchElementException
) - ответ на вопрос, почему в Гуаве нет Iterables.isSingleValue(Iterable)
.
Я думаю, ты ошибаешься. Если:
- вызов метода не изменяет состояние (в отличие от
next()
в итераторе, поэтому существует hasNext()
)
- и вы можете ясно и явно сказать, что возвращаемое значение не является исключительным случаем (в отличие от
null
, возвращаемого из Map#get(Object)
- это может быть нулевое значение или это может означать, что ключ не был найден в карте)
нет необходимости проверять метод, если условие истинно, а затем выполнять некоторую операцию (с утверждением в нем!), Как в вашем примере кода.
Если вы абсолютно уверены, что итерация в этом месте не может иметь размер, отличный от 1, тогда проверка условий является излишней (исключение выдается в других случаях).
Если вы хотите получить только первый элемент в непустой коллекции - collection.iterator.next()
совершенно нормально (NoSuchElementException
выбрасывается, если коллекция пуста).
Если вы ничего не знаете о размере коллекции, тогда Iterables.getFirst(iterable, default)
для вас.
P.S. Если ваш Collections#isSingleValue
здесь используется только локально (следовательно, может быть закрытым), то действительно означает, что вам не нужна эта проверка перед вызовом Iterables#getOnlyValue
.
P.P.S. Другим ответом на ваш вопрос о дизайне Гуавы может быть пункт 57 из Effective Java Джошуа Блоха - в Гуаве я упомянул несколько различных вспомогательных методов, которые прямо говорят, что является исключительным случаем для каждого; логическая проверка не была добавлена, потому что API был как можно меньше.