This answerすでにEnumeration
のうちStream
を作成するソリューションを提供します:
public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
new Iterator<T>() {
public T next() {
return e.nextElement();
}
public boolean hasNext() {
return e.hasMoreElements();
}
},
Spliterator.ORDERED), false);
}
それは勝った結果として得られたStream
は、他Stream
ほど怠惰であることを強調しなければなりませんターミナルアクションが開始される前にすべてのアイテムを処理し、ターミナル操作が短絡している場合、必要なだけ多くのアイテムを繰り返します。
まだ改善の余地があります。すべての要素を直接処理する方法がある場合は、常にforEachRemaining
メソッドを追加します。前記方法は、最も非短絡操作についてStream
実装によって呼び出されます。
public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
new Iterator<T>() {
public T next() {
return e.nextElement();
}
public boolean hasNext() {
return e.hasMoreElements();
}
public void forEachRemaining(Consumer<? super T> action) {
while(e.hasMoreElements()) action.accept(e.nextElement());
}
},
Spliterator.ORDERED), false);
}
しかし、上記のコードは、「それはとても馴染みだからIterator
を使用して」パターンの犠牲者です。作成したIterator
は新しいSpliterator
インタフェースの実装に包まれ、直接Spliterator
を実装する上で何の利点を提供しないれます:ソースコードレベルで
public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, Spliterator.ORDERED) {
public boolean tryAdvance(Consumer<? super T> action) {
if(e.hasMoreElements()) {
action.accept(e.nextElement());
return true;
}
return false;
}
public void forEachRemaining(Consumer<? super T> action) {
while(e.hasMoreElements()) action.accept(e.nextElement());
}
}, false);
}
は、この実装は
Iterator
ベースのと同じくらい簡単ですが、排除します
Spliterator
から
Iterator
への委任。それが唯一の
関連[Java 8の列挙を反復](http://stackoverflow.com/q/23261803/217324) –
関連する質問は、列挙型(Java 1.0)を「反復子」にする方法を尋ねています。 (Java 1.2)。私はそれを 'Stream'(Java 1.8)にする方法を尋ねています。リンクされた質問の最後の答えがこれに答えているように見えますが、その答えは質問された質問に対しては間違っています。その答えは、将来の検索者がうまく見つけることができるようにここに提供する必要があります。おそらく@ArneBurmeisterはこの質問を直接回答するように答えをここにコピーしたいと思いますか? –
リンクされた質問の回答として再開されても、怠け者の行動については議論されません。また、リンクされた質問の範囲ではないので、 'Stream'を作成する別の方法を投稿するのは適切な場所ではありません。 – Holger