Java 8以降で利用できる Stream API を使うことで、コレクションの並び替えを簡潔かつ可読性高く記述できます。
本記事では、複数条件でソートしたい場合の正しい書き方 を、基本から実践例まで丁寧に解説します。
目次
Stream API におけるソートの基本
Stream API では、sorted() メソッドを使用して要素を並び替えます。
|
1 |
stream.sorted() |
ただし、この形式は 自然順序(Comparable 実装) に従ってソートされるため、
独自の条件で並び替えたい場合は Comparator を指定する必要があります。
|
1 |
stream.sorted(Comparator.comparing(...)) |
単一条件でのソート
まずは、単一の条件でソートする基本形です。
例:年齢で昇順ソート
|
1 2 3 |
List<Person> sortedList = list.stream() .sorted(Comparator.comparing(Person::getAge)) .toList(); |
このコードでは、Person#getAge() の値を基準に昇順で並び替えています。
複数条件でソートする基本構文
複数条件でソートする場合は、Comparator.thenComparing() を使用します。
基本構文
|
1 2 3 |
Comparator.comparing(条件1) .thenComparing(条件2) .thenComparing(条件3) |
この順序で、
- 条件1で比較
- 同値の場合のみ条件2で比較
- さらに同値の場合は条件3で比較
という動作になります。
実践例:複数条件での昇順ソート
例:部署 → 年齢 → 名前 の順でソート
|
1 2 3 4 5 6 7 |
List<Person> sortedList = list.stream() .sorted( Comparator.comparing(Person::getDepartment) .thenComparing(Person::getAge) .thenComparing(Person::getName) ) .toList(); |
この場合、以下の優先順位でソートされます。
- 部署(
department) - 年齢(
age) - 名前(
name)
昇順・降順を組み合わせる方法
条件ごとに 昇順・降順を切り替える ことも可能です。
例:部署は昇順、年齢は降順
|
1 2 3 4 5 6 7 8 |
List<Person> sortedList = list.stream() .sorted( Comparator.comparing(Person::getDepartment) .thenComparing( Comparator.comparing(Person::getAge).reversed() ) ) .toList(); |
reversed()を使用すると、その条件のみ降順 になります。- 全体を
reversed()すると、すべての条件が反転するため注意が必要です。
null を含む場合の安全なソート
ソート対象の値が null になる可能性がある場合は、Comparator.nullsFirst() または Comparator.nullsLast() を使用します。
例:名前が null の場合は最後に配置
|
1 2 3 4 5 6 7 8 |
List<Person> sortedList = list.stream() .sorted( Comparator.comparing( Person::getName, Comparator.nullsLast(Comparator.naturalOrder()) ) ) .toList(); |
これにより、NullPointerException を回避できます。
Comparator を事前に定義する書き方
処理が長くなる場合は、Comparator を変数として定義すると可読性が向上します。
|
1 2 3 4 5 6 7 8 |
Comparator<Person> personComparator = Comparator.comparing(Person::getDepartment) .thenComparing(Person::getAge) .thenComparing(Person::getName); List<Person> sortedList = list.stream() .sorted(personComparator) .toList(); |
業務コードでは、この書き方が推奨されるケースも多いです。
まとめ
- Stream API で複数条件ソートする場合は
thenComparing()を使用します - 条件の記述順が、そのまま優先順位になります
reversed()により条件単位で降順指定が可能ですnullを含む場合はnullsFirst / nullsLastを使用します- Comparator を分離すると可読性・保守性が向上します
