JAva 8-ソート

6931 ワード

JAva 8以前
Java以前はコレクションをソートするために、通常の方法はこうです.
beanは以下の通り
private static class Person {
    private final String name;
    private final int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}
//                    
Collections.sort(people, new Comparator() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.age - o2.age;
    }
});

Collectionsを用いた静的手法には以下の2つの劣勢がある.1.メソッドは値を返さずに元の集合を変更することで未知の影響を及ぼすが,これも関数式プログラミングが提唱した2.コードが冗長で理解しにくいこと,javaコードの共通病である.
JAva 8以降
Streamタイプを利用したsortedメソッド
ListascendingAge=people.stream().sorted((people1,people2)->people1.getAge()-people2.getAge()).collect(Collectors.toList());

このメソッドは、以前のコレクションを変更せずに新しいコレクションを返しますが、このメソッドはまだ簡潔ではありません.
ListascendingAge=people.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.toList());

compararingIntはComparatorインタフェースの静的メソッドであり、Comparatorインタフェース実装クラスを返すために使用され、getAgeはメソッドリファレンスである
次は完全な関数宣言です.
public static  Comparator comparingInt(ToIntFunction super T> keyExtractor) {
    Objects.requireNonNull(keyExtractor);
    return (Comparator & Serializable)
        (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
}

並べ替えの反転
Java 8以前に、昇順でソートされたComparatorを逆順序でソートする必要がある場合は、Comparatorを変更して完了する必要があります.java 8では、Comparatorのreverse静的メソッドを使用してこのような論理を完了することができます.
people.stream().sorted(Comparator.comparingInt(Person::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);

複数条件の組合せソート
Java 8でComparatorの新しい静的メソッドthenComparingを利用するのは簡単です
集合を名前順に並べ替え名前が同じ場合に年齢順に並べ替える
people.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge)).collect(Collectors.toList()).forEach(System.out::println);

氏名昇順で並べ替え氏名が同じ場合は年齢降順で並べ替える
people.stream().sorted(Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);

氏名降順で並べ替え氏名が同じ場合は年齢昇順で並べ替える
people.stream().sorted(Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge)).collect(Collectors.toList()).forEach(System.out::println);

氏名降順で並べ替え氏名が同じ場合は年齢降順で並べ替える
people.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);

Lambda式の再利用
Lambda式を再利用できるように、変数を使用してLambda式を保存できます.
次のように
Comparator compareAscending = Comparator.comparing(Person::getAge);

さいだいさいしょう
ストリームを使用してコレクション内の最大最小値を検索
people.stream().min(Comparator.comparing(Person::getAge)).ifPresent(System.out::println);