それで、あなたはジャワの 小川 について学ぶためにここにいますが、人々が釣りに行くような種類の小川や水の流れではありません。ここでは データ ストリーム について話します。これは、データの操作をはるかに簡単にする Java 8 で導入された強力な機能です。これを初めて使用する場合でも、試してみたものの完全に解決できなかった場合でも、心配する必要はありません。平易でわかりやすい言葉で旅全体をご説明します。
準備ができて? Java ストリームについて詳しく見ていきましょう!
A Stream は、シーケンス内のデータを処理する方法です。項目のリストがあり、それらの項目を使用して何か (フィルター、並べ替え、マップなど) を実行したいと想像してください。ストリームを使用すると、これらすべてをクリーンかつ効率的な方法で行うことができます。これは、データが処理されるまでさまざまなステップを通過する組み立てラインのようなものです。
ストリームについて覚えておくべき重要な点:
for ループを使用したり、コレクションを直接操作したりしてはどうでしょうか?そうですね、主な理由は 3 つあります:
ストリーム操作の 2 つの主要なタイプを見てみましょう: 中間 と ターミナル。
これらはデータを準備する操作ですが、最終結果はすぐには生成されません。これらは「ワークショップ」のステップと考えてください。
フィルター()
これはふるいのようなものです。条件に基づいて要素を選択します。たとえば、整数のリストから偶数だけを取得したい場合は、filter().
を使用します。
java Copy code Listnumbers = 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 Listwords = Arrays.asList("apple", "banana", "cherry"); List lengths = words.stream() .map(String::length) .collect(Collectors.toList()); // Output: [5, 6, 6]
map を使用する理由 map() は、文字列のリストをその長さのリストに変換するなど、各要素を別のものに変換する必要がある場合に使用されます。
明確な()
重複フィルターのようなものです。これにより、ストリームから重複した要素が削除されます。
java Copy code Listnumbers = 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 Listnames = Arrays.asList("Charlie", "Alice", "Bob"); List sortedNames = names.stream() .sorted() .collect(Collectors.toList()); // Output: ["Alice", "Bob", "Charlie"]
なぜsorted? ソートロジックを自分で書く代わりに、sorted()がそれを処理します。
これらは最終結果を生成するものであり、ストリーム全体の処理をトリガーします。これらを「出口点」と考えてください。
集める()
これは最も一般的な端末操作です。ストリームの結果を収集し、リスト、セット、またはその他のコレクションに入れます。
java Copy code Listnames = 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 は、さまざまな種類のデータを処理するために他の種類のストリームを提供します:
IntStream、LongStream、DoubleStream
これらのストリームは、プリミティブ型の処理に特化しています。 Stream
例:
java Copy code IntStream intStream = IntStream.of(1, 2, 3, 4); int sum = intStream.sum(); // Output: 10
ファイルのストリーム
Files.lines().
を使用してファイルからストリームを作成できます。
java Copy code try (Streamlines = Files.lines(Paths.get("data.txt"))) { lines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
ファイル ストリームを使用する理由 大きなファイルを扱う場合、すべてのデータをメモリにロードするのは効率的ではない可能性があります。ストリームを使用すると、1 行ずつ処理できます。
良い質問です!比較してみましょう:
Java のストリームは、データの処理方法を簡素化することを目的としています。これらにより、コードがより読みやすくなり、保守が容易になり、コレクションを操作する際の効率が向上します。データのフィルタリング、変換、削減のいずれを行う場合でも、Streams では、かさばるループや手動作業の必要性を排除する、明確で簡単なメソッドを利用できます。
ストリームの基本は十分に理解できましたが、ここで終わりにする必要はありません。 Twitter や LinkedIn で私をフォローするか、私のブログをチェックして、すぐにプロになれる Java のヒントをご覧ください。このガイドが役立つと思われた場合は、他の開発者と共有してください。共有することは思いやりのあることだからです。
試してみる準備はできましたか?次のプロジェクトでそのストリームを流しましょう!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3