Trước Java 8, chúng tôi thực hiện Comparable.compareTo(...)
như thế này:Thay CompareToBuilder với Java 8 của Comperator.comparing (...) thenComparing (...)
public int compare(Person a, Person b) {
return new CompareToBuilder()
.append(a.getLastName(), b.getLastName())
.append(a.getFirstName(), b.getFirstName())
.toComparison();
}
Tính đến Java 8, chúng ta có thể làm điều đó như này:
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
Cách Java 8 mới có thể cho phép chúng tôi xóa phụ thuộc commons-lang3
. Có phải đó là cách Java 8 mới nhanh hơn không? Có cách nào để tự động di chuyển không? Tôi không tìm thấy ý định IntelliJ cho nó.
Chú ý rằng nó trở nên phức tạp hơn một chút khi có lệnh ngược lại và so sánh không tự nhiên có liên quan đến:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}
trở thành
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, b);
}
Tôi cần triển khai so sánh tự nhiên của Người, vì vậy tôi không thể áp dụng các thay đổi được đề xuất này. Bạn có tin rằng Comparator.comparing (...) cũng chậm hơn CompareToBuilder không? –
Nếu bạn thực hiện thứ tự tự nhiên, phương thức phải là 'compareTo (Person)' chứ không phải là 'so sánh (Person, Person)', vì vậy câu hỏi là gây hiểu nhầm. Tôi không nghĩ rằng việc sử dụng 'Comparator.comparing' sẽ chậm hơn' CompareToBuilder', nhưng bạn vẫn có thể cải thiện nó bằng cách khai báo trường 'static final' như được hiển thị trong câu trả lời của tôi và thực hiện' compareTo (Person) 'là' trả về BY_NAME.compare (điều này, khác); – Holger
Điểm tốt. Trên thực tế tôi có trường hợp sử dụng mà nó tự nhiên và tôi đã sử dụng trường hợp mà nó là một Comperator tái sử dụng (như trên). Tôi hiểu tại sao nó không còn cần thiết để biến Comperator thành một lớp riêng biệt. –