[解決済み] Java Enumeration を Stream に変換するにはどうすればよいですか?
質問
サードパーティのライブラリで
Enumeration<String>
. この列挙を、Java 8 の
Stream
のようなものを呼び出したい。
filter
,
map
と
flatMap
を付けてください。
これが入っている既存のライブラリはありますか? 私はすでにGuavaとApache Commonsを参照しているので、それらのいずれかが解決策を持っている場合、それは理想的です。
別の方法として、(1) のような、(2) のような、(3) のような、(4) のように
Enumeration
を
Stream
を、すべての怠惰な性質を保持しながら?
どのように解決するのか?
この回答
を作成する解決策をすでに提供しています。
Stream
から
Enumeration
:
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);
}
しかし、上記のコードは、「using」の犠牲になっています。
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
. 読者が新しいAPIについて学ぶことを要求しているだけです。
関連
-
無効な文字定数
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java 8 List<V> を Map<K, V> に変換する。
-
[解決済み] Java 8 StreamをArrayに変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
プロジェクトの依存関係を解決できない。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
-bash: java: コマンドが見つからない 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
Junitのユニットテストエラー
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
[解決済み] IteratorをStreamに変換するには?