9. 終端操作
Javaの終端操作(Terminal Operations)の主要なものを、実際に動かせるサンプルコードでまとめました。
コピー&ペーストして、それぞれの挙動の違いを確認してみてください。
1. コレクション・配列にまとめる (collect, toArray)¶
抽出した結果を、後で使うために変数に保存する最も一般的な方法です。
Java
import java.util.*;
import java.util.stream.Collectors;
List<String> names = Arrays.asList("apple", "banana", "apricot", "cherry");
// Listにまとめる
List<String> listResult = names.stream()
.filter(s -> s.length() > 5)
.collect(Collectors.toList());
// Setにまとめる(重複が消える)
Set<String> setResult = names.stream()
.collect(Collectors.toSet());
// 配列に変換する
String[] arrayResult = names.stream()
.toArray(String[]::new);
2. 判定系 (anyMatch, allMatch, noneMatch)¶
「条件に合うものが含まれているか?」を boolean で即座に返します。
Java
boolean hasApple = names.stream().anyMatch(s -> s.equals("apple")); // true
boolean allStartWithA = names.stream().allMatch(s -> s.startsWith("a")); // false
boolean noneStartWithZ = names.stream().noneMatch(s -> s.startsWith("z")); // true
System.out.println("リンゴはある?: " + hasApple);
3. 検索系 (findFirst, findAny)¶
条件に一致する「中身」を1つ取り出します。
Java
// "a"で始まる最初の要素を取得
Optional<String> result = names.stream()
.filter(s -> s.startsWith("a"))
.findFirst();
// Optionalなので、値がある時だけ処理する
result.ifPresent(s -> System.out.println("見つかった: " + s));
4. 統計・集計系 (count, reduce)¶
数値としての結果や、1つの凝縮された値を作ります。
Java
// 5文字以上の単語を数える
long count = names.stream()
.filter(s -> s.length() >= 6)
.count();
// 全ての文字列をカンマ区切りで合体させる (reduce)
Optional<String> joined = names.stream()
.reduce((s1, s2) -> s1 + ", " + s2);
joined.ifPresent(System.out::println); // apple, banana, apricot, cherry
5. 繰り返し処理 (forEach)¶
結果を何かに代入せず、その場で使い切る(印字など)場合です。
まとめ:戻り値の型を意識しよう¶
終端操作を選ぶときは、**「最終的に何が欲しいか」**で決めます。
| 欲しいもの | 使う終端操作 |
|---|---|
| 加工された新しいリスト | .collect(Collectors.toList()) |
| YES か NO か | .anyMatch() / .allMatch() |
| 見つかった中身の1つ | .findFirst() |
| 合計数や件数 | .sum() / .count() |
| ただ画面に出したいだけ | .forEach() |
次のステップ¶
これで終端操作の基本はバッチリです!
さらにステップアップするなら、**「グループ分け(appleとapricotをAグループにする、など)」**ができる
Collectors.groupingBy という強力な終端操作がありますが、見てみますか?