1. 導入:なぜpartitioningByが必要なのか
Javaでプログラミングをしていると、「リストの中身を、ある条件を満たすグループとそうでないグループに分けたい」という場面によく遭遇します。例えば、「合格者と不合格者」「アクティブユーザーと休眠ユーザー」といった具合です。
従来はfor文で回して複数のリストを作成していましたが、Java 8以降のStream APIを使えば、Collectors.partitioningByを活用することで、わずか1行のコードでスマートに分類できます。コードの可読性を高め、バグを減らすために非常に重要なテクニックです。
2. 基礎知識:partitioningByとは?
Collectors.partitioningByは、Streamの要素を「条件(Predicate)」に基づいて、true(条件に合致)とfalse(合致しない)の2つに分割するコレクターです。
戻り値は「Map
3. 実装・解決策
この機能を使うには、Stream APIのcollectメソッドにpartitioningByを渡します。引数には「条件式(ラムダ式)」を指定します。
・条件に一致する要素:Mapのキー「true」に格納
・条件に一致しない要素:Mapのキー「false」に格納
この仕組みにより、条件分岐を自分で書く必要がなくなり、宣言的に処理を記述できます。
4. サンプルプログラム
以下のコードは、数値のリストを「偶数」と「それ以外(奇数)」に分割する例です。そのままコピーして実行してみてください。
import java.util.;
import java.util.stream.;
public class PartitioningExample {
public static void main(String[] args) {
List
// partitioningByを使用して偶数(n % 2 == 0)で分割する
Map
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// 結果の表示
System.out.println(“偶数グループ: ” + partitionedMap.get(true));
System.out.println(“奇数グループ: ” + partitionedMap.get(false));
}
}
5. 応用・注意点
現場で使う際に知っておくべきポイントが2つあります。
注意点1:キーは必ず「true」と「false」
たとえ条件に合う要素が一つもなかったとしても、Mapには「false」というキーが含まれます(値は空のリスト)。そのため、nullチェックを意識する必要が少なく、安定した処理が可能です。
応用:ダウンストリームコレクターの活用
partitioningByの第2引数にさらにコレクターを渡すと、分類した後のリストに対して、集計(sumやcounting)を同時に行うことができます。
例えば、partitioningBy(条件, Collectors.counting()) と書けば、それぞれのグループの「個数」を直接取得できます。
リストを分けるだけでなく、「その後どう処理したいか」を意識すると、Stream APIをより使いこなせるようになりますよ。

コメント