Javaのラムダ式でforEachにif・if-else・三項演算子・breakは使える?徹底解説!
生徒
「先生!ラムダ式って便利って聞いたんですけど、forEachでif文とかif-else文って使えますか?」
先生
「うん、条件分岐は使えるよ。でも使い方には少しコツがあるんだ。」
生徒
「あと、forEachの途中でbreakしたいときって、できるんですか?」
先生
「良い着眼点だね。ラムダ式では通常のforループと違ってbreakはできないんだ。でも代替案があるから、それも含めて詳しく説明しよう!」
1. JavaのforEachとラムダ式の基本をおさらい
Javaのラムダ式は、匿名関数のように使える便利な書き方です。特にListなどのコレクション操作において、forEachメソッドと組み合わせることで、簡潔なループ処理が可能になります。
例えば、次のように書けます。
List<String> names = Arrays.asList("Tanaka", "Sato", "Suzuki");
names.forEach(name -> System.out.println(name));
このように、従来のforループよりもスッキリと書けるのが魅力です。
2. forEachの中でif文は使える?
ラムダ式の中でも、if文は普通に使えます。条件を満たす要素だけに処理をしたいときに便利です。
names.forEach(name -> {
if (name.startsWith("T")) {
System.out.println("Tで始まる名前: " + name);
}
});
このように、if文を波括弧({ })で囲むことで、複数行の処理も可能です。
3. if-else文も使える?
はい、if-else文も問題なく使えます。条件によって処理内容を変えたい場合に役立ちます。
names.forEach(name -> {
if (name.length() > 5) {
System.out.println("長い名前: " + name);
} else {
System.out.println("短い名前: " + name);
}
});
Javaのラムダ式は、通常のブロックと同様に、ifやelseがそのまま使えるため、初心者にも扱いやすい構文です。
4. 三項演算子(条件演算子)は使える?
もちろん、三項演算子も使用可能です。コードをさらに簡潔にしたいときに便利です。
names.forEach(name -> {
String type = name.length() > 5 ? "長い" : "短い";
System.out.println(type + "名前: " + name);
});
三項演算子は、条件 ? 真の処理 : 偽の処理 という形で使います。
5. breakは使える?途中でループを抜けたいときは?
ここが最大の注意点です。ラムダ式のforEachでは、breakやcontinueといったループ制御文が使えません。
以下のようなコードはコンパイルエラーになります:
names.forEach(name -> {
if (name.equals("Sato")) {
break; // コンパイルエラー
}
System.out.println(name);
});
これは、ラムダ式がブロックスコープ内で実行されるため、ループ制御ができない仕様です。
6. breakしたいならどうする?代替案とは
どうしてもループの途中で抜けたい場合は、forEachではなく従来のforループやStream APIのfilterやanyMatchなどを使いましょう。
for (String name : names) {
if (name.equals("Sato")) {
break;
}
System.out.println(name);
}
また、Streamを使えば柔軟な条件分岐や検索も可能です:
Optional<String> result = names.stream()
.filter(name -> name.startsWith("S"))
.findFirst();
result.ifPresent(System.out::println);
findFirst()を使えば、特定条件で1つ見つかった時点で終了できます。
7. 処理の分岐が複雑な場合のコツ
処理が複雑になる場合は、ラムダ式の中にロジックをすべて書くのではなく、メソッドとして切り出すのがおすすめです。
names.forEach(JavaLambdaExample::processName);
public static void processName(String name) {
if (name.contains("a")) {
System.out.println("aを含む: " + name);
} else {
System.out.println("aを含まない: " + name);
}
}
こうすれば読みやすく、保守性も高まります。
8. ラムダ式とforEachの使いどころを理解しよう
Javaのラムダ式とforEachを使いこなせると、コードの記述量を減らせて読みやすさが向上します。しかし、すべての処理に適しているわけではなく、breakのような制御が必要なときは別の方法を選びましょう。
Javaのラムダ式に慣れてくると、Streamとの組み合わせでさらに効率的なコードが書けるようになります。