1. 導入:なぜ並び替えが必要なのか
Javaでプログラミングをしていると、「リスト内のデータを名前順に並べ替えたい」「数値が大きい順に取得したい」という場面によく遭遇します。従来のJavaではコレクションの並び替えにCollections.sort()を使っていましたが、コードが冗長になりがちでした。Java 8から導入されたStream APIの「sorted()」を使えば、宣言的かつ簡潔に並び替えを実現できます。可読性が高く、バグを減らすためにもぜひマスターしておきたいテクニックです。
2. 基礎知識:StreamとComparator
まず前提として、Stream APIは「データの流れ」を扱う仕組みです。sorted()は、そのデータの流れの中で要素を整列させる中間操作です。
並び替えのルールを決めるのが「Comparator(比較器)」です。
・自然順序(数値なら昇順、文字列なら辞書順)で並べる場合は、引数なしのsorted()を使用します。
・独自のルール(特定のフィールドで並べる、降順にするなど)を適用する場合は、Comparatorを引数に渡します。
3. 実装と解決策
ListやSetのデータを並び替える際は、まず.stream()でストリームに変換し、sorted()を呼び出した後、.collect(Collectors.toList())などで再びリストに戻すのが定石です。
特に重要なのがComparatorの指定方法です。Comparator.comparing()を使うことで、「どの項目を基準にするか」を非常に短いコードで指定できます。
4. サンプルプログラム
以下のコードは、社員名簿を名前順(昇順)と年齢順(降順)で並び替える例です。コピーして実行してみてください。
import java.util.;
import java.util.stream.Collectors;
public class SortExample {
public static void main(String[] args) {
List employees = Arrays.asList(
new Employee("田中", 30),
new Employee("佐藤", 25),
new Employee("鈴木", 40)
);
// 1. 名前で昇順に並び替え
List sortedByName = employees.stream()
.sorted(Comparator.comparing(e -> e.getName()))
.collect(Collectors.toList());
System.out.println("名前順: " + sortedByName);
// 2. 年齢で降順に並び替え
List sortedByAgeDesc = employees.stream()
.sorted(Comparator.comparing(Employee::getAge).reversed())
.collect(Collectors.toList());
System.out.println("年齢順(降順): " + sortedByAgeDesc);
}
}
class Employee {
private String name;
private int age;
public Employee(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
public String toString() { return name + "(" + age + "歳)"; }
}
5. 応用・注意点
現場で活用する際の重要な注意点が3つあります。
1. nullの取り扱いに注意
リストの中にnullが含まれていると、sorted()実行時にNullPointerExceptionが発生することがあります。Comparator.nullsFirst()やnullsLast()を使って、nullを最初または最後に配置する工夫が必要です。
2. 大規模データでのパフォーマンス
sorted()は「中間操作」ですが、全ての要素をメモリ上に保持して比較を行う必要があるため、非常に大きなリストを扱う場合はメモリ消費量に注意してください。
3. 変更不可コレクションの活用
並び替えた結果を元のリストに反映させたくない場合は、最後に.toList()(Java 16以降)や.collect(Collectors.toUnmodifiableList())を使うことで、意図しない書き換えを防ぐ安全なコードになります。
これらを意識するだけで、あなたの書くJavaコードは格段にプロフェッショナルで堅牢なものになりますよ!

コメント