web-dev-qa-db-ja.com

Iterator.forEachRemaining()とIterable.forEach()の両方を持つ意味は何ですか?

両方ともパラメーターとしてコンシューマーを取得します。 Java 8がTime APIで行われたような混乱を回避するためのものである場合、なぜそれが新しい混乱を追加したのですか?または、いくつかのポイントが欠けていますか?

14
mostafa.S

2つの方法がどちらも存在する理由を理解するには、最初にIteratorIterableを理解する必要があります。

Iteratorは、基本的には「次の要素」を持ち、通常は末尾を持つものです。

Iterableは、有限または無限シーケンスの要素を含むものであり、次の要素を取得し続けることで反復を超えることができます。つまり、IterablesはIteratorsによって反復できます。

これが理解できたので、問題の2つの方法の違いについてお話ししましょう。

例として配列リストを使用してみましょう。これは配列リストの中にあるものです:

_[1, 3, 6, 8, 0]
_

Iterable.forEach()を呼び出してSystem.out::print()を渡すと、_13680_が出力されます。これは、_Iterable.forEach_が要素のシーケンス全体を反復処理するためです。

一方、配列リストのIteratorを取得してnextを2回呼び出した場合、forEachRemainingSystem.out::print()で呼び出す前に、_680_が出力されます。 Iteratorはすでに最初の2つの要素を繰り返し処理したため、「残りの」要素は6、8、0です。

54
Sweeper