はじめに
Java Stream API は、データのコレクションを操作するための強力で汎用性の高い方法を提供します。このチュートリアルでは、Stream API を活用してコレクションをフィルタリングする方法を探り、必要なデータを効率的に抽出する方法を学びます。Java の初心者でも、経験豊富な開発者でも、このガイドを通じてデータ処理タスクを合理化するための知識とスキルを身につけることができます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Java Stream API は、データのコレクションを操作するための強力で汎用性の高い方法を提供します。このチュートリアルでは、Stream API を活用してコレクションをフィルタリングする方法を探り、必要なデータを効率的に抽出する方法を学びます。Java の初心者でも、経験豊富な開発者でも、このガイドを通じてデータ処理タスクを合理化するための知識とスキルを身につけることができます。
Java Stream API は、Java 8 で導入された強力な機能で、宣言的かつ関数型スタイルでデータのコレクションを処理することができます。ストリームは、明示的な反復処理や可変状態を必要とせずに、フィルタリング、マッピング、ソート、リダクションなど、さまざまなデータ操作を行う方法を提供します。
ストリームは、要素のシーケンスであり、それらの要素に対してさまざまな演算を行うことができます。ストリームは、コレクション、配列、または I/O リソースなど、さまざまなデータソースから作成することができます。ストリームは、複数の操作をチェーンすることができる流暢な API を提供し、コードをより表現力豊かで読みやすくします。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
stream.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.forEach(System.out::println);
上記の例では、整数のリストからストリームを作成し、偶数をフィルタリングし、それらを 2 倍の値にマッピングしてから、結果を出力しています。
ストリームは、データを操作するために使用できる幅広い操作を提供します。最も一般的な操作には、以下のようなものがあります。
次のセクションでは、コレクションをフィルタリングするための Stream API の具体的な使い方について詳しく見ていきます。
フィルタリングは、Java Stream API を使ってコレクションに対して行われる最も一般的な操作の 1 つです。フィルタリングを使うと、与えられた述語に基づいてコレクションから要素のサブセットを選択することができます。
filter()
メソッドは、ストリームにフィルターを適用するために使用されます。このメソッドは、フィルタリング条件を表すラムダ式またはメソッド参照を引数として取ります。
List<String> names = Arrays.asList("John", "Jane", "Bob", "Alice");
Stream<String> filteredNames = names.stream()
.filter(name -> name.startsWith("J"));
filteredNames.forEach(System.out::println);
上記の例では、名前のリストからストリームを作成し、filter()
メソッドを使って、文字「J」で始まる名前のみを選択しています。
複数の filter()
呼び出しをチェーンすることで、ストリームに複数のフィルタリング条件を適用することができます。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> filteredNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.filter(n -> n > 5);
filteredNumbers.forEach(System.out::println);
この例では、まず偶数のみを選択するように数値をフィルタリングし、次に 5 より大きい偶数のみを選択するために 2 番目のフィルターを適用しています。
フィルタリングは、マッピング、ソート、リダクションなどの他のストリーム操作と組み合わせて、より複雑なデータ変換を行うことができます。
List<Person> persons = Arrays.asList(
new Person("John", 30),
new Person("Jane", 25),
new Person("Bob", 35),
new Person("Alice", 28)
);
List<String> youngAdultNames = persons.stream()
.filter(p -> p.getAge() >= 18 && p.getAge() < 30)
.map(Person::getName)
.collect(Collectors.toList());
System.out.println(youngAdultNames);
この例では、まず Person
オブジェクトのリストをフィルタリングして若年成人(18 歳以上 30 歳未満)のみを選択し、次に各 Person
オブジェクトの Name
プロパティをマッピングし、最後に結果を新しいリストに収集しています。
Java Stream API を使ったフィルタリングの威力を理解することで、データのコレクションを効果的に操作および処理することができます。次のセクションでは、フィルターを適用するより実践的な例を探っていきます。
これで Java Stream API を使ったフィルタリングの基本をしっかりと理解できたと思います。では、知識を定着させるためにいくつかの実践的な例を見ていきましょう。
文字列のリストがあり、特定の長さを持つものや、特定の文字で始まるものだけを選択したいとします。
List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// 文字数が 5 より多い単語をフィルタリング
List<String> longWords = words.stream()
.filter(word -> word.length() > 5)
.collect(Collectors.toList());
System.out.println(longWords); // [banana, cherry, elderberry]
// 'a' で始まる単語をフィルタリング
List<String> wordsStartingWithA = words.stream()
.filter(word -> word.startsWith("a"))
.collect(Collectors.toList());
System.out.println(wordsStartingWithA); // [apple, date]
Stream API を使って、整数や倍精度浮動小数点数などの数値データをフィルタリングすることもできます。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 偶数をフィルタリング
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4, 6, 8, 10]
// 5 より大きい数値をフィルタリング
List<Integer> numbersGreaterThan5 = numbers.stream()
.filter(n -> n > 5)
.collect(Collectors.toList());
System.out.println(numbersGreaterThan5); // [6, 7, 8, 9, 10]
Person
オブジェクトなどのカスタムオブジェクトのコレクションにもフィルターを適用することができます。
class Person {
private String name;
private int age;
// Getters, setters, and constructor
}
List<Person> persons = Arrays.asList(
new Person("John", 30),
new Person("Jane", 25),
new Person("Bob", 35),
new Person("Alice", 28)
);
// 30 歳より年上の人をフィルタリング
List<Person> personsOlderThan30 = persons.stream()
.filter(p -> p.getAge() > 30)
.collect(Collectors.toList());
System.out.println(personsOlderThan30); // [Person(name=Bob, age=35)]
// 名前が 'J' で始まる人をフィルタリング
List<Person> personsWithNameStartingWithJ = persons.stream()
.filter(p -> p.getName().startsWith("J"))
.collect(Collectors.toList());
System.out.println(personsWithNameStartingWithJ); // [Person(name=John, age=30), Person(name=Jane, age=25)]
これらの実践的な例を見ることで、Java で filter()
メソッドを使ってコレクションを効果的に操作する方法がもっと理解できたはずです。
このチュートリアルを終えるころには、Java Stream API を使ってコレクションをフィルタリングする方法をしっかりと理解できるようになっているでしょう。filter()
、distinct()
、limit()
などのさまざまなフィルタリングメソッドと、それらを特定のユースケースに適用する方法を学びます。得られた知識を活かして、より効率的で保守しやすい Java コードを書き、データ処理のワークフローを最適化し、Stream API の全ての可能性を引き出すことができるようになります。