『Listを任意の単位で分割して、分割したリストごとに処理をしたい』なんてケースはありませんか?
たとえば、社員検索APIにリクエストが発生する場合に、パフォーマンスを考慮して、一回のリクエストに指定できる社員IDリストは上限100までと決まっているとか。
そういった場合に、リストを決められた上限数ごとに分割してくれる関数があると便利です。
そこで、ListUtils.partition()
という関数を利用します!
ライブラリの依存追加
本記事ではビルドツールにGradleを利用します。
build.gradle
のdependencies
に、下記の依存関係を追加します。
build.gradle
dependencies {
implementation 'org.apache.commons:commons-collections4:任意のバージョン'
}
サンプルコード
たとえば、ある複数人のメンバーをランダムに2人組のグループにして、グルーピングした結果をコンソールに出力するという簡単なプログラムがあるとします。
メソッド | 役割 |
---|---|
main() | membersを生成してgroupingMember()を呼び出す |
groupingMember() | membersをランダムな2人組のグループに分割し、 グループ単位にannounceGroup()を呼び出す |
announceGroup() | 引数のgroupをコンソールに出力する |
Main.java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.collections4.ListUtils;
public class Main {
private static int count = 1;
public static void main(String[] args) {
List<String> members = Arrays.asList("佐藤", "鈴木", "高橋", "伊藤", "上野", "三浦");
groupingMember(members);
}
/*
メンバーを受け取りランダムにグループ分けをする.
*/
public static void groupingMember(List<String> members) {
// ランダムで2人組のグループを作成する.
Collections.shuffle(members);
ListUtils.partition(members, 2).forEach(Main::announceGroup);
}
/*
グループメンバを発表する.
*/
private static void announceGroup(List<String> group) {
System.out.println("第" + count + "グループ: " + group);
count++;
}
}
ポイント
-
Collections.shuffle(members);
でmembers
の要素をランダムに並び替えをしています。 -
ListUtils.partition(members, 2)
によってリストであるmembers
を2要素単位で分割しています。 -
forEach(Main::announceGroup)
はラムダのメソッド参照の記述で、forEach(list -> announceGroup(list))
と同じ意味です。
実行結果
main()を実行してみます。
> Task :Main.main()
第1グループ: [三浦, 佐藤]
第2グループ: [上野, 鈴木]
第3グループ: [高橋, 伊藤]
きちんと2人単位にグルーピングされて、グループごとにコンソールに出力されていることが分かりますね。
まとめ
こんな感じで、ListUtils.partition(リスト, 分割したい単位)
と記述すれば、簡単にListを分割してくれます。
とても便利ですね!
以上になります 🙌