Javaのラムダ式の使いどころを徹底解説!検索・ソート・ビジネスロジックに役立つ実践例
生徒
「先生、Javaのラムダ式って実際の仕事でどんな場面で使うんですか?」
先生
「それはとても大事なポイントですね。ラムダ式は検索やソート、ビジネスロジックの処理など、いろんな実務で活躍しますよ。」
生徒
「Streamとかと一緒に使うと便利って聞いたことあります!」
先生
「そうですね。Stream APIと組み合わせることで、ラムダ式は処理をシンプルかつ効率的に記述できるようになります。では、実際の使いどころを一緒に学んでいきましょう。」
1. 検索処理に使えるラムダ式
Javaのラムダ式は、リストやコレクションから特定の条件に合うデータを検索する際に便利です。Streamのfilterメソッドと組み合わせることで、柔軟な条件指定が可能になります。
例えば、従業員リストから年齢が30歳以上の人を抽出する場合、次のように書けます。
List<Employee> employees = getEmployeeList();
List<Employee> filtered = employees.stream()
.filter(e -> e.getAge() >= 30)
.collect(Collectors.toList());
ラムダ式の中で条件を書くだけで、必要なデータを簡単に取り出せるのが大きなメリットです。
2. ソート処理にも大活躍のラムダ式
JavaではComparatorインターフェースをラムダ式で簡潔に実装できます。例えば名前順や日付順に並べ替える処理は、次のように記述できます。
List<Employee> sorted = employees.stream()
.sorted((a, b) -> a.getName().compareTo(b.getName()))
.collect(Collectors.toList());
また、複数条件でソートしたい場合も、ラムダ式とComparator.thenComparingを組み合わせれば実現可能です。
List<Employee> sorted = employees.stream()
.sorted(Comparator.comparing(Employee::getDepartment)
.thenComparing(Employee::getName))
.collect(Collectors.toList());
このように、ラムダ式を使えばソート処理を非常に柔軟に記述できます。
3. ビジネスロジックの集約処理にも使える
売上合計や人数のカウントなど、ビジネスロジックによく登場する集約処理にもラムダ式は向いています。
int totalSales = salesList.stream()
.mapToInt(Sale::getAmount)
.sum();
このようにラムダ式とmapToIntを使えば、売上金額などの合計を簡単に求めることができます。また、条件に合う件数を数えるときにはfilterとcountの組み合わせが有効です。
long highSalesCount = salesList.stream()
.filter(s -> s.getAmount() > 10000)
.count();
実務ではこのような処理が非常によく登場します。ラムダ式で書けば処理も読みやすくなります。
4. 条件分岐を使ったデータ変換処理
ビジネスロジックでは条件に応じて値を変換したい場面もあります。ラムダ式でmapを使えば、各要素に対して柔軟な変換が可能です。
List<String> results = scores.stream()
.map(score -> {
if (score >= 80) return "優秀";
else if (score >= 60) return "合格";
else return "不合格";
})
.collect(Collectors.toList());
このように処理をラムダ式内に直接記述できるため、外部メソッドを用意せずに完結したコードが書けます。
5. グループ化と集計処理も簡潔に
ラムダ式とCollectors.groupingByを使えば、データをグループ化して集計することも可能です。例えば部門ごとの人数を数える処理は以下のように記述できます。
Map<String, Long> departmentCount = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));
このようなグルーピング処理もラムダ式を使えば非常にシンプルに記述できるため、集計系のビジネスロジックにもぴったりです。
6. 実務での注意点と設計のヒント
ラムダ式は便利な反面、複雑になりすぎると読みづらくなります。条件が増える場合はPredicateなどを別で定義する、またはメソッド参照で整理するとよいでしょう。
Predicate<Employee> isSenior = e -> e.getAge() >= 40;
List<Employee> result = employees.stream()
.filter(isSenior)
.collect(Collectors.toList());
また、ラムダ式の中で例外処理を書くことは避けた方がよいケースが多いです。事前にバリデーションを済ませる、例外を投げるメソッドを別にするなど、設計を工夫することでラムダ式をクリーンに保てます。