, böyle Comparable.compareTo(...)
uygulamaya Bu:Java 8'in Comperator.comparing (...) ile CompareToBuilder değiştirin thenComparing (...) Java 8 Önce
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
yeni Java 8 yolu bize commons-lang3
bağımlılık damla izin verebilir. Bu yeni Java 8 yolu daha hızlı mı? Otomatik olarak taşınmanın bir yolu var mı? Bunun için bir IntelliJ niyetini bulamadım.
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);
}
Kişinin doğal karşılaştırmasını yapmam gerekiyor, bu yüzden önerilen değişiklikleri uygulayamıyorum. Comparator.comparing (...) 'in CompareToBuilder'den daha yavaş olduğuna inanıyor musunuz? –
Eğer doğal düzeni uygularsanız, yöntem “Karşılaştır (Kişi, Kişi)” yerine “CompareTo (Kişi)” olmalıdır, bu yüzden soru yanıltıcıydı. "Comparatorer.comparing" işlevinin "CompareToBuilder" den daha yavaş olacağını düşünmüyorum ama yine de, "static final" alanını cevabımda gösterildiği gibi ilan ederek geliştirebilir ve "compareTo (Person)" öğesini uygulayabilirsiniz. BY_NAME.compare (bu, diğer); – Holger
İyi nokta. Aslında doğal düzeni olan durumlarda kullanıyorum ve yeniden kullanılabilir bir Comperator (yukarıda olduğu gibi) olduğu durumlarda kullanıyorum. Bu uzman Comperator'ı ayrı bir sınıfa hazırlamak için neden gerekmediğini görüyorum. –