Почему нет метода getFirst (iterable)?
Iterables представляют два метода для getLast
public static <T> T getLast(Iterable<T> iterable);
public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);
но только один для getFirst
public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);
Есть ли какая-либо причина разработки/реализации для нарушения симметрии?
Ответы
Ответ 1
Я думаю, дело в том, что нет причины для getFirst(iterable)
в том, что это можно сделать с помощью iterable.iterator().next()
. Guava делает отличную попытку сохранить API небольшим и, таким образом, не добавляет вещи, которые могут/должны быть сделаны легко другим способом.
С другой стороны, еще нет механизма проверки, если итерабельность пуста, и если это так возвращает значение по умолчанию вместо первого значения. Следовательно, getFirst(iterable, default)
.
Кроме того, нет простого способа получить последний элемент, следовательно getLast(iterable)
и getLast(iterable, default)
Ответ 2
Как дополнение к ответу @JohnB, я хотел бы показать Guava думает о getFirst(iterable)
. Кевин Бурриллион (руководитель Guava dev) пишет там:
iterable.iterator(). next() отлично понятен и доступен для чтения и однозначна. Я точно знаю, что он делает, тогда как с помощью Iterators.getFirst() мне нужно сбежать и посмотреть, как эта библиотека дизайнер решил это сделать.
Кроме того, ваше понимание непротиворечивости глубоко ошибочно. Мы используем согласованность в том, как мы представляем важную функциональность, но мы никогда используйте его, чтобы оправдать добавление бесполезных функций, и вы не должны в ваших собственных библиотеках!
Итак, у вас есть выбор:
- с помощью
iterable.iterator().next()
,
- используя
Iterables.getFirst(Iterable<T> iterable, T default)
,
- используя
Iterables.get(Iterable<T>, 0)
,
- написание собственного метода (возможно, содержащего
iterable.iterator().next()
и некоторые документы) и использовать его как i.e. Iterables2.getFirst(iterable)
,
- ждет, когда Кевин передумает;)
PS: У меня было подобное сомнение некоторое время назад и в то время было найдено точный дубликат этого вопроса.