Streamインスタンスを作成したら、次は任意の中間操作ができます。
Streamインスタンスの作成方法については、以下の記事を参照してください。
JavaのStreamインスタンスを作成する
JavaのStream APIにおける中間操作
JavaのStream APIにおける中間操作は、ストリームの各要素に対して何らかの処理を行い、その結果を新しいストリームとして返す操作です。中間操作は遅延実行され、終端操作が呼び出されるまで実際の処理は行われません。以下に、よく使われる中間操作のいくつかを紹介します。
filter
条件に合う要素だけを取り出します。
filter 操作は、ストリームの各要素に対して条件をテストし、その条件を満たす要素のみを含む新しいストリームを生成します。条件はラムダ式で指定します。
この操作をすることで要素の数は減りますが、要素の型自体は変わりません。
例えば、次のコードでは、名前が "A" で始まる要素のみをフィルタリングしています。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Stream<String> filteredNames = names.stream().filter(name -> name.startsWith("A"));
// 結果: "Alice"
map
各要素に対して何らかの処理を行い、その結果を新しいストリームとして返します。
map 操作は、ストリームの各要素に対して指定された関数を適用し、その結果からなる新しいストリームを生成します。この操作は、要素を変換するのに便利です。
例えば、次のコードでは、各名前の文字数を取得しています。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Stream<Integer> nameLengths = names.stream().map(name -> name.length());
// 結果: 5, 3, 7 (各名前の文字数)
sorted
要素を並び替えます。
sorted 操作は、ストリームの要素を自然順序または指定された順序でソートし、その結果からなる新しいストリームを生成します。デフォルトでは自然順序(数値の場合は小さい順、文字列の場合は辞書順など)でソートされます。
例えば、次のコードでは、名前を辞書順にソートしています。
List<String> names = Arrays.asList("Charlie", "Bob", "Alice");
Stream<String> sortedNames = names.stream().sorted();
// 結果: "Alice", "Bob", "Charlie"
複数の中間操作
これらの操作を組み合わせることで、データの処理を柔軟に行うことができます。
たとえば、名前が "A" で始まる人の名前の文字数をソートする場合、以下のように書くことができます。
List<String> sortedFilteredLengths = names.stream()
.filter(name -> name.startsWith("A"))
.map(name -> name.length())
.sorted()
.collect(Collectors.toList());
// 結果: [5] (Alice の文字数)
このように、filter, map, sorted などの中間操作を使うことで、複雑なデータ処理のロジックを簡潔に記述することができます。