Почему нет метода getFirst (итерируемого)? - PullRequest
35 голосов
/ 12 декабря 2011

Итерации представляют два метода для 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);

Есть ли какая-либо причина проектирования / реализации для нарушения симметрии?

Ответы [ 2 ]

38 голосов
/ 12 декабря 2011

Я думаю, дело в том, что нет никакой причины для getFirst(iterable) в том, что это можно сделать с помощью iterable.iterator().next(). Guava делает отличную попытку сохранить API небольшим и поэтому не добавляет вещей, которые можно / нужно легко сделать другим способом.

С другой стороны, еще не существует механизма для проверки того, является ли итерируемая пустым, и в этом случае возвращает значение по умолчанию вместо первого значения. Следовательно, getFirst(iterable, default).

Кроме того, не существует простого способа получить последний элемент, поэтому getLast(iterable) и getLast(iterable, default)

21 голосов
/ 12 декабря 2011

В качестве дополнения к ответу @ JohnB я хотел бы показать мнение разработчиков Guava о getFirst(iterable). Кевин Бурриллион (главный разработчик Guava) пишет там:

iterable.iterator (). Next () совершенно понятный и читаемый однозначно . Я точно знаю, что он делает, в то время как с Iterators.getFirst () я должен убежать и посмотреть, как эта библиотека дизайнер решил сделать это.

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

Итак, у вас есть выбор:

  • с использованием iterable.iterator().next(),
  • с использованием Iterables.getFirst(Iterable<T> iterable, T default),
  • с использованием Iterables.get(Iterable<T>, 0),
  • написание собственного метода (возможно, содержащего iterable.iterator().next() и несколько документов) и использование его как, например, Iterables2.getFirst(iterable),
  • ждет, когда Кевин передумает;)

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

...