導入:なぜComparator.reversed()が重要なのか
Javaでリストを並び替える際、数値や文字列を「昇順(小さい順)」から「降順(大きい順)」にしたいことはよくあります。昔は自分で比較ロジックを書き直していましたが、Java 8以降はComparator.reversed()を使うことで、既存の比較ルールをそのまま反転させることができます。コードの可読性を高め、保守性を向上させるために必須のテクニックです。
基礎知識:Comparatorとは何か
Comparatorは、Javaにおいて「オブジェクトをどのように比較して並べるか」というルールを定義するインターフェースです。例えば、名前で並べるのか、年齢で並べるのか、といった基準を定義します。
reversed()は、そのインターフェースが持つメソッドの一つで、既に定義された比較ルールを「逆にする」働きをします。これにより、わざわざ比較処理を二通り書く必要がなくなります。
実装:Comparator.reversed()の使い方
基本的には、リストやストリームに対してソートを行う際に使用します。
1. まず、基準となる比較ルールを作成します(例:Comparator.comparing(User::getAge))。
2. その後に.reversed()を呼び出すだけで、比較ロジックが反転します。
サンプルプログラム:名前と年齢のソート例
以下は、ユーザーのリストを年齢順でソートし、それを降順(年齢が高い順)に並び替えるコードです。
import java.util.;
public class Main {
static class User {
String name;
int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
List users = Arrays.asList(
new User("田中", 25),
new User("佐藤", 40),
new User("鈴木", 30)
);
// 1. 年齢の昇順(若い順)でソート
users.sort(Comparator.comparingInt(u -> u.age));
// 2. 昇順の結果を反転させて、降順(年齢が高い順)にする
users.sort(Comparator.comparingInt((User u) -> u.age).reversed());
// 結果を出力
users.forEach(u -> System.out.println(u.name + ": " + u.age));
}
}
応用・注意点:現場での活用と陥りやすい罠
注意点1:Nullの扱い
リストの中にnullが含まれている場合、Comparatorを使用するとNullPointerExceptionが発生する可能性があります。現場では、Comparator.nullsFirst()やComparator.nullsLast()を組み合わせて、nullを考慮した安全なソートを心がけましょう。
注意点2:メソッドチェーンの順番
Comparatorを連結させる場合(例:年齢で並べて、同じなら名前で並べる)、.reversed()をどこに付けるかで挙動が変わります。「年齢降順かつ名前昇順」にしたい場合、全体にreversedをかけると名前の順序まで逆転してしまうため、Comparator.comparing(User::getAge).reversed().thenComparing(User::getName)のように、適用範囲を意識して記述することが重要です。
この機能を使いこなせば、複雑なソート処理も数行でスッキリと書けるようになりますよ。ぜひ試してみてください。

コメント