Vor Java 8 implementierten wir Comparable.compareTo(...)
wie folgt aus:ersetzen CompareToBuilder mit Java 8 des Comperator.comparing (...) thenComparing (...)
public int compare(Person a, Person b) {
return new CompareToBuilder()
.append(a.getLastName(), b.getLastName())
.append(a.getFirstName(), b.getFirstName())
.toComparison();
}
Ab Java 8, wir können es tun, wie dies:
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
die neue Java 8 Art und Weise könnte es uns ermöglichen, die commons-lang3
Abhängigkeit fallen zu lassen. Ist das neue Java 8 schneller? Gibt es eine Möglichkeit, automatisch zu migrieren? Ich habe keine IntelliJ Absicht dafür gefunden.
Beachten Sie, dass es ein bisschen komplexer wird, wenn es umgekehrt Aufträge und nicht natürliche Vergleich beteiligt ist:
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);
}
Ich muss den natürlichen Vergleich der Person implementieren, damit ich diese vorgeschlagenen Änderungen nicht anwenden kann. Glauben Sie, dass Comparator.comparing (...) auch langsamer ist als CompareToBuilder? –
Wenn Sie die natürliche Reihenfolge implementieren, sollte die Methode "compareTo (Person)" statt "compare (Person, Person)" sein, also war die Frage irreführend. Ich glaube nicht, dass die Verwendung von 'Comparator.comparing' langsamer ist als' CompareToBuilder', aber Sie können es dennoch verbessern, indem Sie das 'static final' Feld wie in meiner Antwort gezeigt deklarieren und' compareTo (Person) 'als' implementieren return BY_NAME.compare (this, other); '. – Holger
Guter Punkt. Tatsächlich habe ich Anwendungsfälle, wo es eine natürliche Reihenfolge ist und ich habe Anwendungsfälle, wo es ein wiederverwendbarer Comperator ist (wie oben). Ich sehe, warum es nicht mehr nötig ist, diesen spezialisierten Comperator zu einer separaten Klasse zu machen. –