「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java Streams: 完全な初心者のための究極のガイド

Java Streams: 完全な初心者のための究極のガイド

2024 年 11 月 4 日に公開
ブラウズ:403

それで、あなたはジャワの 小川 について学ぶためにここにいますが、人々が釣りに行くような種類の小川や水の流れではありません。ここでは データ ストリーム について話します。これは、データの操作をはるかに簡単にする Java 8 で導入された強力な機能です。これを初めて使用する場合でも、試してみたものの完全に解決できなかった場合でも、心配する必要はありません。平易でわかりやすい言葉で旅全体をご説明します。

準備ができて? Java ストリームについて詳しく見ていきましょう!


Java Streams: The Ultimate Guide for Complete Beginners


Javaのストリームとは何ですか?

A Stream は、シーケンス内のデータを処理する方法です。項目のリストがあり、それらの項目を使用して何か (フィルター、並べ替え、マップなど) を実行したいと想像してください。ストリームを使用すると、これらすべてをクリーンかつ効率的な方法で行うことができます。これは、データが処理されるまでさまざまなステップを通過する組み立てラインのようなものです。

ストリームについて覚えておくべき重要な点:

  1. ストリームは元のデータを変更しません。それらはデータのビューまたはパイプラインと考えてください。
  2. ストリームはデータを遅延処理します。つまり、最終結果を生成するように指示されるまで実際の作業は行われません。これにより、不必要な計算が回避されます。
  3. ストリームは 1 回限りの使用です。ストリームは消費されると消滅します。再利用したい場合は、新しいものを作成する必要があります。

ストリームを使用する理由

for ループを使用したり、コレクションを直接操作したりしてはどうでしょうか?そうですね、主な理由は 3 つあります:

  • よりクリーンなコード: 反復的でかさばるループを記述する必要はありません。ストリームは、クリーンで読みやすいデータ処理方法を提供します。
  • パフォーマンスの向上: 遅延評価により、ストリームはより効率的にデータを処理します。必要な場合にのみデータを処理するため、処理時間を節約できます。
  • 関数型スタイル: ストリームは、より宣言的な関数型プログラミング スタイルを Java にもたらします。つまり、方法ではなく、何をしたいかに焦点を当てることができます。

ストリームはどのように機能するのでしょうか?基本

ストリーム操作の 2 つの主要なタイプを見てみましょう: 中間ターミナル

1. 中間操作

これらはデータを準備する操作ですが、最終結果はすぐには生成されません。これらは「ワークショップ」のステップと考えてください。

  • フィルター()

    これはふるいのようなものです。条件に基づいて要素を選択します。たとえば、整数のリストから偶数だけを取得したい場合は、filter().
    を使用します。

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 3, 4, 5);
    List evenNumbers = numbers.stream()
                                       .filter(n -> n % 2 == 0)
                                       .collect(Collectors.toList());
    // Output: [2, 4]
    
    

    フィルタを使用する理由は何ですか? filter() を使用しない場合は、リストを手動でループし、一致する要素のみを新しいリストに追加する必要があります。 filter() を使用すると、これを 1 つのクリーンなステップで実行できます。

  • 地図()

    これは変圧器です。要素を受け取り、別のものを返します。たとえば、文字列のリストがあり、各文字列の長さが必要な場合:

    java
    Copy code
    List words = Arrays.asList("apple", "banana", "cherry");
    List lengths = words.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
    // Output: [5, 6, 6]
    
    

    map を使用する理由 map() は、文字列のリストをその長さのリストに変換するなど、各要素を別のものに変換する必要がある場合に使用されます。

  • 明確な()

    重複フィルターのようなものです。これにより、ストリームから重複した要素が削除されます。

    java
    Copy code
    List numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
    List distinctNumbers = numbers.stream()
                                           .distinct()
                                           .collect(Collectors.toList());
    // Output: [1, 2, 3, 4, 5]
    
    

    なぜ区別されるのでしょうか? 通常のリストでは、手動で重複をチェックする必要があります。 unique() はこれを 1 行で実行します。

  • 並べ替え()

    これにより、データが自然な順序 (または必要に応じてカスタムの順序) で並べ替えられます。

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List sortedNames = names.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
    // Output: ["Alice", "Bob", "Charlie"]
    
    

    なぜsorted? ソートロジックを自分で書く代わりに、sorted()がそれを処理します。

2. 端末の操作

これらは最終結果を生成するものであり、ストリーム全体の処理をトリガーします。これらを「出口点」と考えてください。

  • 集める()

    これは最も一般的な端末操作です。ストリームの結果を収集し、リスト、セット、またはその他のコレクションに入れます。

    java
    Copy code
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List upperNames = names.stream()
                                   .map(String::toUpperCase)
                                   .collect(Collectors.toList());
    // Output: ["CHARLIE", "ALICE", "BOB"]
    
    

    収集する理由 ストリームの結果をコレクションに集めるには、ほとんどの場合、collect() を使用します。ここが最後の目的地です。

  • forEach()

    結果が必要なく、各項目に対してアクション (印刷など) を実行したいだけの場合は、forEach() が便利です。

    java
    Copy code
    numbers.stream()
           .forEach(System.out::println);
    
    

    Each を使用する理由 これは、コンソールへのデータの出力やファイルへの書き込みなどの副作用に最適です。

  • 減らす()

    reduce() は大量のデータを受け取り、それを 1 つの結果にまとめます。たとえば、数値のリストを合計する場合:

    java
    Copy code
    int sum = numbers.stream()
                     .reduce(0, Integer::sum);
    // Output: 15
    
    

    reduce を行う理由は何ですか? 値を 1 つの結果に結合または蓄積する必要がある場合は、reduce() が最適です。


他のタイプのストリーム

すべてのストリームがコレクションから作成されるわけではありません。 Java は、さまざまな種類のデータを処理するために他の種類のストリームを提供します:


Java Streams: The Ultimate Guide for Complete Beginners


  1. IntStream、LongStream、DoubleStream

    これらのストリームは、プリミティブ型の処理に特化しています。 Stream のような値をボックス化およびボックス化解除する代わりに、これらを使用してパフォーマンスの低下を回避します。

    例:

    java
    Copy code
    IntStream intStream = IntStream.of(1, 2, 3, 4);
    int sum = intStream.sum();  // Output: 10
    
    
  2. ファイルのストリーム

    Files.lines().
    を使用してファイルからストリームを作成できます。

    java
    Copy code
    try (Stream lines = Files.lines(Paths.get("data.txt"))) {
        lines.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    

    ファイル ストリームを使用する理由 大きなファイルを扱う場合、すべてのデータをメモリにロードするのは効率的ではない可能性があります。ストリームを使用すると、1 行ずつ処理できます。


ストリームをいつ使用するか?

  • データの変換: コレクションの各要素を変更する必要がある場合。
  • フィルタリング:特定の条件に一致するデータのみを選択したい場合。
  • データの集計: コレクションを 1 つの結果 (合計、平均など) にまとめる必要がある場合。
  • 並列処理: ストリームは並列処理もサポートします。 .ParallelStream() を使用すると、タスクを複数のスレッドに分割して処理を高速化できます。

ストリーム vs. ループ: なぜループだけを使用しないのでしょうか?

良い質問です!比較してみましょう:

  1. 可読性: Streams では、どのようにではなく、何をしたいかに焦点を当てます。ループでは、余分な定型コード (カウンターや条件文など) を大量に作成する傾向があります。
  2. パフォーマンス: ストリームは、特に遅延評価と並列処理で、大きなデータを効率的に処理できるように最適化されています。ループでは、そのようなすぐに使える最適化は提供されません。
  3. 柔軟性: ストリームを使用すると、クリーンで機能的なスタイルで操作 (フィルタリング、マッピング、削減など) を連鎖させることができます。ループでは、ループ内にさらにロジックをネストする必要があります。

まとめ

Java のストリームは、データの処理方法を簡素化することを目的としています。これらにより、コードがより読みやすくなり、保守が容易になり、コレクションを操作する際の効率が向上します。データのフィルタリング、変換、削減のいずれを行う場合でも、Streams では、かさばるループや手動作業の必要性を排除する、明確で簡単なメソッドを利用できます。

ストリームの基本は十分に理解できましたが、ここで終わりにする必要はありません。 Twitter や LinkedIn で私をフォローするか、私のブログをチェックして、すぐにプロになれる Java のヒントをご覧ください。このガイドが役立つと思われた場合は、他の開発者と共有してください。共有することは思いやりのあることだからです。


試してみる準備はできましたか?次のプロジェクトでそのストリームを流しましょう!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/wittedtech-by-harshit/java-streams-the-ultimate-guide-for-complete-beginners-40e2?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3