【Java学習|初心者向け】Java Stream APIでデータを賢く2分割!Collectors.partitioningByの使い方を解説

1. 導入:なぜpartitioningByが必要なのか

Javaでプログラミングをしていると、「リストの中身を、ある条件を満たすグループとそうでないグループに分けたい」という場面によく遭遇します。例えば、「合格者と不合格者」「アクティブユーザーと休眠ユーザー」といった具合です。
従来はfor文で回して複数のリストを作成していましたが、Java 8以降のStream APIを使えば、Collectors.partitioningByを活用することで、わずか1行のコードでスマートに分類できます。コードの可読性を高め、バグを減らすために非常に重要なテクニックです。

2. 基礎知識:partitioningByとは?

Collectors.partitioningByは、Streamの要素を「条件(Predicate)」に基づいて、true(条件に合致)false(合致しない)の2つに分割するコレクターです。
戻り値は「Map>」という形式になります。キーがBoolean型なので、必ず「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 numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// partitioningByを使用して偶数(n % 2 == 0)で分割する
Map> partitionedMap = numbers.stream()
.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をより使いこなせるようになりますよ。

コメント

タイトルとURLをコピーしました