Streamを使った並び替え

とりあえずいつもの。(準備)

        Person p1 = new Person("abc", 30);
        Person p2 = new Person("def", 25);
        Person p3 = new Person("ghi", 17);
        Person p4 = new Person("jkl", 8);
        Person p5 = new Person("mno", 30);

        List<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

①年齢の昇順で並び替え

       ArrayList<Person> sortedList = 
                list.stream()
                .sorted(Comparator.comparing(Person::getAge))
                .collect(Collectors.toCollection(ArrayList::new));


②年齢の降順で並び替え

       ArrayList<Person> reverseSortedList = 
                list.stream()
                .sorted(Comparator.comparing(Person::getAge).reversed())//←#reversedを使用
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(reverseSortedList);

③年齢の昇順 + 名前の昇順

       ArrayList<Person> ageReverseAndNameAscSortedList = 
                list.stream()
                .sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Person::getName)) //#reversedに続けて#thenComparingを使用
                .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(ageReverseAndNameAscSortedList);


結果

[jkl - 8, ghi - 17, def - 25, abc - 30, aaa - 30]//年齢の昇順
[abc - 30, aaa - 30, def - 25, ghi - 17, jkl - 8]//年齢の降順
[aaa - 30, abc - 30, def - 25, ghi - 17, jkl - 8]//年齢の昇順 + 名前の昇順 ※aaaが先頭に来ている。

④オブジェクトがComparableな場合
Comparableを実装したPerson

public class ComparablePerson implements Comparable<ComparablePerson> {
    
    private int age;
    private String name;

    public int getAge() {
        return age;
    }
    
    public ComparablePerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(ComparablePerson another) {
        if (this.getAge() != another.getAge()) {
            return this.getAge() - another.getAge(); //①年齢の昇順
        } else { 
            return this.getName().compareTo(another.getName()); //②名前の昇順
        }
    }
    
    @Override
    public String toString() {
        return "age = " + this.getAge() + ",name = " + this.getName() + "|";
    }

}

オブジェクトがComparableな場合、Stream#sortedには特に引数はいらない。 実装した#compareToの自然順序付けになる。

       ComparablePerson p1 = new ComparablePerson("aaa", 11);
        ComparablePerson p2 = new ComparablePerson("bbb", 22);
        ComparablePerson p3 = new ComparablePerson("acc", 5);
        ComparablePerson p4 = new ComparablePerson("add", 23);
        ComparablePerson p5 = new ComparablePerson("baa", 22);
        List<ComparablePerson> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        ArrayList<ComparablePerson> sortedList = list.stream().sorted().collect(Collectors.toCollection(ArrayList::new)); //←#sortedにはなにも渡さなくてよい。
        System.out.println(sortedList);

ほかにもいろいろあるみたいだが以上。