ホームページ >Java >&#&チュートリアル >Java ストリームをマスターする: 開発者のための完全ガイド

Java ストリームをマスターする: 開発者のための完全ガイド

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 19:53:10944ブラウズ

Mastering Java Streams: A Complete Guide for Developers

Java 8 で導入された Java Streams は、この言語への最も強力な追加機能の 1 つです。これらにより、コレクションやシーケンスに対する関数型の操作が可能になり、Java でのデータ処理へのアプローチ方法が変わります。ストリームは、フィルタリング、マッピング、データ収集などのタスクを簡素化すると同時に、パフォーマンス向上のための並列操作もサポートします。この投稿では、Streams の基礎を説明し、Streams がサポートする操作の種類について説明し、この重要な機能を最大限に活用するのに役立つ例を示します。

目次

1.  What is Streams and why we need it?
2.  Types of Streams: Intermediate vs. Terminal
3.  Creating Streams in Java
4.  Intermediate Stream Operations
5.  Terminal Stream Operations
6.  Using Streams with Lambdas
7.  Conclusion

Streams とは何ですか? なぜそれが必要なのでしょうか?

Java のストリームは、データのコレクションを処理する強力な方法を提供します。これらを使用すると、基礎となるデータを変更することなく、コレクションの要素に対してフィルタリングや変換などの機能的な操作を実行できます。ストリームは、開発者がデータ処理のより高いレベルの抽象化を提供し、それをどのように達成するかではなく、何を達成したいかに集中するのに役立ちます。

ストリームは、Java の表現力を高め、定型コードを削減するために、ラムダ式や関数型インターフェイスとともに Java 8 に導入されました。ストリームを組み込むことにより、Java は関数型プログラミングのパラダイムを受け入れ始め、よりクリーンで簡潔なコードを可能にしました。

ストリームの主な利点

  • 宣言型データ処理: ループや条件を手動で管理するのではなく、実行したい操作を記述します。
  • 不変性とステートレス性: ストリーム操作はソース データ構造を変更しません。
  • 並列処理: 並列ストリームのサポートにより、操作を複数のスレッドに簡単に分散できます。

ストリームの種類: 中間ストリームと末端ストリーム

ストリームは主に 2 つのタイプに分類されます:

  • 中間操作: これらの操作はストリームを変換し、結果として別のストリームを返します。これらは遅延型です。つまり、端末操作が呼び出されるまで実行されません。
  • ターミナル操作: これらの操作はストリームのデータ処理をトリガーし、ストリーム以外の結果 (コレクション、単一の値、またはブール値など) を返します。ターミナル操作が実行されると、ストリームは消費されたとみなされ、再利用できなくなります。

例:

List<String> names = List.of("Alice", "Bob", "Charlie", "David");

// Intermediate (lazy) operations: filter and map
Stream<String> stream = names.stream()
                             .filter(name -> name.startsWith("A"))
                             .map(String::toUpperCase);

// Terminal operation: collect
List<String> filteredNames = stream.collect(Collectors.toList());
System.out.println(filteredNames); // Output: [ALICE]

この例では、フィルターとマップは中間操作であり、ターミナル操作の収集が呼び出されるまで実行されません。

Java でのストリームの作成

Java にはストリームを作成するいくつかの方法が用意されており、データの処理を簡単に開始できます。

  • コレクションから

ストリームを作成する最も一般的な方法は、List、Set、Map などのコレクションから作成することです。

1.  What is Streams and why we need it?
2.  Types of Streams: Intermediate vs. Terminal
3.  Creating Streams in Java
4.  Intermediate Stream Operations
5.  Terminal Stream Operations
6.  Using Streams with Lambdas
7.  Conclusion
  • 配列から
List<String> names = List.of("Alice", "Bob", "Charlie", "David");

// Intermediate (lazy) operations: filter and map
Stream<String> stream = names.stream()
                             .filter(name -> name.startsWith("A"))
                             .map(String::toUpperCase);

// Terminal operation: collect
List<String> filteredNames = stream.collect(Collectors.toList());
System.out.println(filteredNames); // Output: [ALICE]
  • Stream.of の使用
List<String> names = List.of("Alice", "Bob", "Charlie");
Stream<String> nameStream = names.stream();
  • 無限ストリーム (生成されたストリーム)

Java では、Stream.generate と Stream.iterate を使用して無限ストリームを作成できます。

String[] namesArray = {"Alice", "Bob", "Charlie"};
Stream<String> nameStream = Arrays.stream(namesArray);

中間ストリームの操作

中間操作は新しいストリームを返し、遅延します。これは、端末操作が呼び出された場合にのみ実行されることを意味します。

  • フィルター(述語)

条件に基づいて要素をフィルタリングします。

Stream<String> stream = Stream.of("Alice", "Bob", "Charlie");
  • map(関数)

要素をある型から別の型に変換します。

Stream<Double> randomNumbers = Stream.generate(Math::random).limit(5);
Stream<Integer> counting = Stream.iterate(0, n -> n + 1).limit(5);
  • 並べ替え(コンパレータ)

自然な順序で、またはコンパレータに基づいて要素を並べ替えます。

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());
  • peek(消費者)

各要素に対してアクションを実行します。これはデバッグに役立つことがよくあります。

List<String> names = List.of("Alice", "Bob");
List<Integer> nameLengths = names.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());

ターミナルストリームの操作

端末操作は最後に実行され、実際のデータ処理がトリガーされて最終結果が返されます。

  • forEach(Consumer)

ストリーム内の各要素に対してアクションを実行します。

List<String> names = List.of("Bob", "Alice", "Charlie");
List<String> sortedNames = names.stream()
                                .sorted()
                                .collect(Collectors.toList());
  • 収集(コレクター)

ストリームの要素をコレクション、リスト、セット、またはその他のデータ構造に収集します。

List<String> names = List.of("Alice", "Bob");
names.stream()
     .peek(name -> System.out.println("Processing " + name))
     .collect(Collectors.toList());
  • カウント()

ストリーム内の要素の数をカウントします。

List<String> names = List.of("Alice", "Bob");
names.stream().forEach(System.out::println);
  • anyMatch(Predicate)、allMatch(Predicate)、noneMatch(Predicate)

要素が指定された条件に一致するか、すべて一致するか、または一致しないかをチェックします。

List<String> names = List.of("Alice", "Bob");
Set<String> nameSet = names.stream().collect(Collectors.toSet());
  • findFirst() と findAny()

ストリームの最初の要素または任意の要素を説明するオプションを返します。

List<String> names = List.of("Alice", "Bob");
long count = names.stream().count();

Lambda でのストリームの使用

ストリームとラムダ式は密接に連携します。ストリームは関数型インターフェイスに基づいているため、ラムダとシームレスに連携し、表現力豊かで簡潔なデータ処理が可能になります。

たとえば、名前のリストをフィルタリングして「A」で始まる名前を検索し、それを大文字に変換します。

List<String> names = List.of("Alice", "Bob", "Charlie");
boolean hasAlice = names.stream().anyMatch(name -> name.equals("Alice"));

この例では:

  • フィルターはラムダ名を受け取ります -> name.startsWith("A") で名前をフィルターします。
  • map はメソッド参照 String::toUpperCase を受け取り、名前を大文字に変換します。

結論

Java Streams は Java に関数型プログラミング機能をもたらし、表現力豊かで簡潔なデータ操作を可能にします。中間操作と末端操作の違い、およびストリームを効果的に作成および使用する方法を理解することで、コードの可読性と保守性を大幅に向上させることができます。ストリームとラムダをワークフローに統合して、よりクリーンで効率的な Java アプリケーションを作成します。

ストリーミングをお楽しみください!

以上がJava ストリームをマスターする: 開発者のための完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。