Подтвердить что ты не робот

Почему нет метода 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);

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

4b9b3361

Ответ 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: У меня было подобное сомнение некоторое время назад и в то время было найдено точный дубликат этого вопроса.