Przed Java 8 wdrożyliśmy Comparable.compareTo(...)
takiego:Wymień CompareToBuilder z Java 8 za Comperator.comparing (...) thenComparing (...)
public int compare(Person a, Person b) {
return new CompareToBuilder()
.append(a.getLastName(), b.getLastName())
.append(a.getFirstName(), b.getFirstName())
.toComparison();
}
Jako Java 8, możemy to zrobić jak to:
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
nowy Java 8 sposób może pozwolić nam spadać zależność commons-lang3
. Czy ta nowa Java 8 jest szybsza? Czy istnieje sposób automatycznej migracji? Nie znalazłem intencji IntelliJ dla tego.
Zauważ, że staje się nieco bardziej skomplikowane, gdy istnieją odwrotnej zamówienia i nie naturalne porównanie jest zaangażowany:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}
staje
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, b);
}
Muszę wdrożyć naturalne porównanie osoby, więc nie mogę zastosować tych sugerowanych zmian. Czy uważasz, że Comparator.comparing (...) jest również wolniejszy niż CompareToBuilder? –
Jeśli zaimplementujesz porządek naturalny, metodą powinno być 'compareTo (Person)' zamiast 'compare (Person, Person)', więc pytanie było mylące. Nie sądzę, że użycie 'Comparator.comparing' będzie wolniejsze niż' CompareToBuilder', ale mimo to możesz go poprawić deklarując pole 'static final' jak pokazano w mojej odpowiedzi i implementuję' compareTo (Person) 'as ' return BY_NAME.compare (ten, inny); '. – Holger
Dobra uwaga. Właściwie mam przypadki użycia, w których jest to naturalny porządek i mam przypadki użycia, gdzie jest to wielokrotnego użytku Comperatora (jak wyżej). Rozumiem, dlaczego nie jest już konieczne, aby ten wyspecjalizowany Comperator był oddzielną klasą. –