web-dev-qa-db-ja.com

なぜgetFirst(iterable)メソッドがないのですか?

IterablesgetLastの2つのメソッドを提示

 public static <T> T getLast(Iterable<T> iterable);
 public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);

getFirstは1つだけ

 public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);

対称性を壊すための設計/実装の理由はありますか?

36
Stan Kurilin

ポイントは、これがgetFirst(iterable)で実行できるという点でiterable.iterator().next()の理由がないということです。 Guavaは、APIを小さく保つための優れた試みを行っているため、別の方法で簡単に実行できる、または簡単に実行できるはずのものを追加しません。

一方、イテラブルが空かどうかをテストし、空の場合は最初の値ではなくデフォルト値を返すメカニズムはまだありません。したがって、getFirst(iterable, default)です。

また、最後の要素を取得する簡単な方法がないため、getLast(iterable)およびgetLast(iterable, default)

38
John B

@JohnBの回答への追加として、私は示したいと思います GuavaのgetFirst(iterable))に関する開発者の意見 。 Kevin Bourrillion(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:私はしばらく前に同様の疑いを持っていて、その時に この質問の正確な複製 を見つけました。

22
Xaerxess