1. ホーム

[解決済み】Stream<T>がIterable<T>を実装していないのはなぜですか?

2022-03-30 19:15:56

質問

Java 8 では、クラス ストリーム<T> というメソッドがあり、不思議なことに

Iterator<T> iterator()

ということは、インターフェイス イテラブル<T> はまさにこのメソッドを要求しているのですが、そうではありません。

foreachループを使ってStreamを反復処理する場合、次のようにしなければなりません。

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }

何か見逃していませんか?

どのように解決するのですか?

すでに同じ質問をされています メーリングリストに ☺. 主な理由は、Iterableは再反復可能なセマンティックを持ち、一方Streamはそうではないからです。

<ブロッククオート

というのが主な理由だと思います。 Iterable は再利用可能であることを意味するのに対し Stream は一度しか使用できないもので、どちらかというと Iterator .

もし Stream 拡張 Iterable を受け取った場合、既存のコードは驚くかもしれません。 Iterable を投げてくるので Exception は を行った場合、2回目は for (element : iterable) .