Java列挙をストリームに変換するにはどうすればよいですか?

ミカ・ゾルトゥ:

私にを提供するサードパーティのライブラリがありEnumeration<String>ます。私はその列挙をJava 8としてゆっくりと処理などStream呼び出したいと思います。filtermapflatMap

これが含まれている既存のライブラリはありますか?私はすでにGuavaとApache Commonsを参照しているので、これらのいずれかが理想的なソリューションを備えているかどうか。

または、すべての怠惰な性質を保持しながらEnumeration、a Streama に変える最善/最も簡単な方法は何ですか?

ホルガー:

この答えは、すでに作成ソリューション提供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);
}

ただし、上記のコードは「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基づくのと同じくらい簡単ですが、a Spliteratorからへの委任を排除しIteratorます。読者が新しいAPIについて学ぶ必要があるだけです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

列挙型をC#のリストに変換するにはどうすればよいですか?

分類Dev

Haskellで列挙型のリストを別のタイプの列挙型に変換するにはどうすればよいですか?

分類Dev

forループをストリームに変換するにはどうすればよいですか

分類Dev

文字列のストリームを文字列のストリームのペアに変換するにはどうすればよいですか?

分類Dev

KDB:テーブルの列をリストに変換するにはどうすればよいですか?

分類Dev

mysqlクレートを使用するときにMySQL列挙型をRust列挙型に変換するにはどうすればよいですか?

分類Dev

文字列リストをintのリストに変換するにはどうすればよいですか?

分類Dev

文字列のリストをsympy変数に変換するにはどうすればよいですか?

分類Dev

Rのリスト変数に文字列を変換するにはどうすればよいですか?

分類Dev

シリアル化されたストリームを文字列に変換するにはどうすればよいですか?

分類Dev

ストリームを使用して2D int配列を2D String配列に変換するにはどうすればよいですか?

分類Dev

ストリームを使用して2次元のint配列を単一の文字列に変換するにはどうすればよいですか?

分類Dev

文字列をリストに明示的に変換するにはどうすればよいですか。Python

分類Dev

配列値をLInkedHashMapからリストに変換するにはどうすればよいですか?

分類Dev

Powershellで文字列をストリームオブジェクトに変換するにはどうすればよいですか?

分類Dev

Pythonリストを列ベクトルに変換するにはどうすればよいですか?

分類Dev

PythonでASCII値のリストを文字列に変換するにはどうすればよいですか?

分類Dev

「\ r \ n」を含む文字列をリストに変換するにはどうすればよいですか?

分類Dev

リストを複数の列を持つデータフレームに変換するにはどうすればよいですか?

分類Dev

変換ストリームの先頭に追加するにはどうすればよいですか?

分類Dev

テキスト領域をJavaの入力ストリームに変換するにはどうすればよいですか?

分類Dev

列挙型ベースのシステムをオブジェクト指向構造に変更するにはどうすればよいですか?

分類Dev

TypeScriptで文字列を列挙型に変換するにはどうすればよいですか?

分類Dev

JavaでHashMapをリストに変換するにはどうすればよいですか?

分類Dev

Project Reactor 3でコールドストリームをホットストリームに変換するにはどうすればよいですか?

分類Dev

文字列を文字のリストに変換するにはどうすればよいですか?

分類Dev

文字のリストをpurescriptの文字列に変換するにはどうすればよいですか

分類Dev

文字列をMaybeIntのリストに変換するにはどうすればよいですか

分類Dev

リストをcsvの列に変換するにはどうすればよいですか?

Related 関連記事

  1. 1

    列挙型をC#のリストに変換するにはどうすればよいですか?

  2. 2

    Haskellで列挙型のリストを別のタイプの列挙型に変換するにはどうすればよいですか?

  3. 3

    forループをストリームに変換するにはどうすればよいですか

  4. 4

    文字列のストリームを文字列のストリームのペアに変換するにはどうすればよいですか?

  5. 5

    KDB:テーブルの列をリストに変換するにはどうすればよいですか?

  6. 6

    mysqlクレートを使用するときにMySQL列挙型をRust列挙型に変換するにはどうすればよいですか?

  7. 7

    文字列リストをintのリストに変換するにはどうすればよいですか?

  8. 8

    文字列のリストをsympy変数に変換するにはどうすればよいですか?

  9. 9

    Rのリスト変数に文字列を変換するにはどうすればよいですか?

  10. 10

    シリアル化されたストリームを文字列に変換するにはどうすればよいですか?

  11. 11

    ストリームを使用して2D int配列を2D String配列に変換するにはどうすればよいですか?

  12. 12

    ストリームを使用して2次元のint配列を単一の文字列に変換するにはどうすればよいですか?

  13. 13

    文字列をリストに明示的に変換するにはどうすればよいですか。Python

  14. 14

    配列値をLInkedHashMapからリストに変換するにはどうすればよいですか?

  15. 15

    Powershellで文字列をストリームオブジェクトに変換するにはどうすればよいですか?

  16. 16

    Pythonリストを列ベクトルに変換するにはどうすればよいですか?

  17. 17

    PythonでASCII値のリストを文字列に変換するにはどうすればよいですか?

  18. 18

    「\ r \ n」を含む文字列をリストに変換するにはどうすればよいですか?

  19. 19

    リストを複数の列を持つデータフレームに変換するにはどうすればよいですか?

  20. 20

    変換ストリームの先頭に追加するにはどうすればよいですか?

  21. 21

    テキスト領域をJavaの入力ストリームに変換するにはどうすればよいですか?

  22. 22

    列挙型ベースのシステムをオブジェクト指向構造に変更するにはどうすればよいですか?

  23. 23

    TypeScriptで文字列を列挙型に変換するにはどうすればよいですか?

  24. 24

    JavaでHashMapをリストに変換するにはどうすればよいですか?

  25. 25

    Project Reactor 3でコールドストリームをホットストリームに変換するにはどうすればよいですか?

  26. 26

    文字列を文字のリストに変換するにはどうすればよいですか?

  27. 27

    文字のリストをpurescriptの文字列に変換するにはどうすればよいですか

  28. 28

    文字列をMaybeIntのリストに変換するにはどうすればよいですか

  29. 29

    リストをcsvの列に変換するにはどうすればよいですか?

ホットタグ

アーカイブ