、我々はこのようなComparable.compareTo(...)
を実装しましたこれは:のJava 8のComperator.comparing(...)でCompareToBuilderを交換しthenComparing(...)は、Java 8の前
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
新しいJava 8の方法は、私たちはcommons-lang3
依存関係をドロップすることが可能かもしれません。 新しいJava 8の方が高速ですか?自動的に移行する方法はありますか? IntelliJの意図が見つかりませんでした。
が逆の注文があり、非自然の比較が関与しているとき、それは少し複雑になっていることに注意してください:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}
は
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, b);
}
私はPersonの自然な比較を実装する必要があるため、これらの変更を適用することはできません。 Comparator.comparing(...)もCompareToBuilderよりも遅いと思いますか? –
自然順序を実装する場合、メソッドは 'compare(Person、Person)'ではなく 'compareTo(Person)'でなければなりません。私は 'Comparator.comparing'を使うのが' CompareToBuilder'よりも遅いとは思っていませんが、私の答えのように 'static final'フィールドを宣言して' compareTo(Person) 'を' BY_NAME.compare(これ、他); 'を返します。 – Holger
良い点。実際には、自然な順序のユースケースがあり、再利用可能なComperator(上記のような)のユースケースがあります。私は、なぜその特化したComperatorを別のクラスにする必要がなくなったのかを理解しています。 –