ホームページ  >  記事  >  Java  >  Java Stream APIでの端末操作例を分析する

Java Stream APIでの端末操作例を分析する

王林
王林転載
2023-05-08 17:34:17836ブラウズ

    1. Java Stream パイプラインのデータ処理操作

    この号の前に書いた記事で、Java Stream パイプライン フローには Java が使用されていることを紹介したことがあります。コレクションクラス要素の処理を簡略化するための API。使用プロセスは 3 つの段階に分かれています。この記事を始める前に、図に示すように、これら 3 つのステージを新しい友達に紹介する必要があると思います。

    Java Stream APIでの端末操作例を分析する

    • #最初のステージ(図青): コレクション、配列、または行テキスト ファイルを Java Stream パイプライン ストリームに変換します

    • 第 2 段階 (図の点線部分): パイプライン ストリーミング データ処理操作、 内のすべての要素をパイプライン処理します。前のパイプの出力要素は、次のパイプの入力要素として機能します。

    • 第 3 段階 (図の緑色): パイプライン フローの結果処理操作。これがこの記事の中心的な内容です。

    学習を開始する前に、以前に説明した例を確認する必要があります:

    List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
    List<String> list = nameStrs.stream()
            .filter(s -> s.startsWith("L"))
            .map(String::toUpperCase)
            .sorted()
            .collect(toList());
    System.out.println(list);

    まず、stream() メソッドを使用して文字列 List For を変換します。パイプライン ストリーム Stream

    を呼び出してから、パイプライン データ処理操作を実行します。まずフィルター関数を使用して、大文字の L で始まるすべての文字列をフィルターします。次に、パイプライン内の文字列を大文字の toUpperCase に変換してから、sorted 関数を呼び出します。並べ替える方法。これらの API の使用方法は、この記事の以前の記事で紹介されています。ラムダ式と関数参照も使用されます。

    最後に、結果処理に収集関数を使用し、Java Stream パイプライン ストリームをリストに変換します。リストの最終出力は次のとおりです: [LEMUR, LION]

    Java Stream パイプライン フローを使用しない場合は、上記の関数を完了するために必要なコード行の数を検討してください。 ?話題に戻りますが、この記事では第 3 段階、つまりパイプライン ストリームの処理結果に対してどのような操作を実行できるのかについて説明します。始めましょう!

    2. ForEach と ForEachOrdered

    型変換を実行するのではなく、Stream パイプライン ストリームの処理結果を出力したいだけの場合は、forEach() メソッドまたは forEachOrdered() を使用できます。方法 。

    Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
            .parallel()
            .forEach(System.out::println);
    Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
            .parallel()
            .forEachOrdered(System.out::println);

    Parallel() 関数は、パイプライン内の要素が逐次ではなく並列で処理されることを示し、処理速度が速くなります。ただし、これにより、パイプライン フロー内の後の要素が最初に処理され、前の要素が後で処理される可能性があり、要素の順序は保証されません。保証はありませんが、forEachOrdered メソッドは、要素が出力される順序が、要素がパイプライン ストリームに入る順序と一致していることを保証できます。つまり、次のようになります (forEach メソッドはこの順序を保証できません):

    Monkey
    Lion

    Giraffe
    Lemur
    Lion

    3. 要素のコレクションcollect

    Java ストリームの最も一般的な使用法は、最初にコレクション クラスをパイプライン ストリームに変換し、2 番目にパイプライン ストリーム データを処理し、3 番目にパイプライン ストリームを変換することです。処理結果をコレクションクラスに格納します。次に、collect() メソッドは、パイプライン ストリームの処理結果をコレクション クラスに変換する機能を提供します。

    3.1. Set として収集

    Collectors.toSet() メソッドを通じて Stream の処理結果を収集し、すべての要素を Set コレクションに収集します。

    Set<String> collectToSet = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ) 
    .collect(Collectors.toSet());
    //最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。

    3.2. List への収集

    同様に、

    toList()

    コレクターを使用して要素を List に収集できます。 <pre class="brush:java;">List&lt;String&gt; collectToList = Stream.of( &quot;Monkey&quot;, &quot;Lion&quot;, &quot;Giraffe&quot;, &quot;Lemur&quot;, &quot;Lion&quot; ).collect(Collectors.toList()); // 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]</pre>3.3. 共通の収集メソッド

    上で紹介した要素収集メソッドはすべて専用です。たとえば、Set タイプのコレクションを収集するには Collectors.toSet() を使用し、List タイプのコレクションを収集するには Collectors.toList() を使用します。では、データ要素を収集して Collection インターフェイスのサブタイプにデータを収集する、より一般的な方法はあるのでしょうか?したがって、ここでは要素を収集する一般的な方法を示します。つまり、必要な Collection 型にコンストラクターを提供することによって、データ要素を任意の Collection 型に収集できます。

    LinkedList<String> collectToCollection = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ).collect(Collectors.toCollection(LinkedList::new));
    //最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

    注: LinkedList::new はコード内で使用されており、実際には LinkedList のコンストラクターを呼び出して要素をリンク リストに収集します。もちろん、

    LinkedHashSet::new

    PriorityQueue::new などのメソッドを使用して、データ要素を他のコレクション型に収集することもできます。その方が汎用性が高くなります。 3.4. 配列への収集

    toArray(String[]::new) メソッドを通じてストリームの処理結果を収集し、すべての要素を文字列配列に収集します。

    String[] toArray = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ) .toArray(String[]::new);
    //最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

    3.5. Map への収集

    Collectors.toMap() メソッドを使用してデータ要素を Map に収集しますが、パイプライン内の要素がキーとして使用されるか、それともキーとして使用されるかという問題が発生します。価値として。単に「t -> t」を返す Function.identity() メソッドを使用しました (入力は出力のラムダ式です)。さらに、パイプライン ストリーム処理関数

    distinct()

    を使用して、Map キー値の一意性を確保します。 <pre class="brush:java;">Map&lt;String, Integer&gt; toMap = Stream.of( &quot;Monkey&quot;, &quot;Lion&quot;, &quot;Giraffe&quot;, &quot;Lemur&quot;, &quot;Lion&quot; ) .distinct() .collect(Collectors.toMap( Function.identity(), //元素输入就是输出,作为key s -&gt; (int) s.chars().distinct().count()// 输入元素的不同的字母个数,作为value )); // 最终toMap的结果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}</pre>3.6. Grouping By groupingBy

    Collectors.groupingBy は、要素のグループ化コレクションを実装するために使用されます。次のコードは、最初の文字に基づいてさまざまなデータ要素をさまざまなリストに収集し、カプセル化する方法を示しています。地図用。

    Map<Character, List<String>> groupingByList =  Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    )
    .collect(Collectors.groupingBy(
           s -> s.charAt(0) ,  //根据元素首字母分组,相同的在一组
           // counting()        // 加上这一行代码可以实现分组统计
    ));
    // 最终groupingByList内的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}
    //如果加上counting() ,结果是:  {G=1, L=3, M=1}

    这是该过程的说明:groupingBy第一个参数作为分组条件,第二个参数是子收集器。

    四、其他常用方法

    boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);
    // 判断管道中是否包含2,结果是: true
    long nrOfAnimals = Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur"
    ).count();
    // 管道中元素数据总计结果nrOfAnimals: 4
    int sum = IntStream.of(1, 2, 3).sum();
    // 管道中元素数据累加结果sum: 6
    OptionalDouble average = IntStream.of(1, 2, 3).average();
    //管道中元素数据平均值average: OptionalDouble[2.0]
    int max = IntStream.of(1, 2, 3).max().orElse(0);
    //管道中元素数据最大值max: 3
    IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();
    // 全面的统计结果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

    以上がJava Stream APIでの端末操作例を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。