Bài tập:
Bạn có một danh sách people
các đối tượng của lớp Person
có các trường name
và age
. Nhiệm vụ của bạn là sắp xếp danh sách này trước tiên name
và sau đó là theo age
.
Java 7:
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return a.getName().compare(b.getName());
}
});
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return Integer.valueOf(a.getAge()).compare(b.getAge());
}
});
Scala:
val sortedPeople = people.sortBy(p => (p.name, p.age))
Cập nhật
Kể từ khi tôi viết câu trả lời này, đã có một số tiến bộ. Các lambdas (và các tham chiếu phương thức) cuối cùng đã cập bến Java, và chúng đang tấn công thế giới Java như một cơn bão.
Đây là đoạn mã trên sẽ trông như thế nào với Java 8 (do @fredoverflow đóng góp):
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Mặc dù mã này gần như ngắn, nhưng nó không hoạt động hoàn toàn thanh lịch như mã Scala.
Trong giải pháp Scala, các Seq[A]#sortBy
phương pháp chấp nhận một chức năng A => B
mà B
là cần thiết để có một Ordering
. Ordering
là một loại-lớp. Hãy suy nghĩ tốt nhất về cả hai thế giới: Giống như Comparable
, nó ngầm đối với loại được đề cập, nhưng giống như Comparator
, nó có thể mở rộng và có thể được thêm vào hồi tố cho các loại không có nó. Vì Java thiếu các lớp kiểu nên nó phải sao chép mọi phương thức như vậy, một lần cho Comparable
, sau đó cho Comparator
. Ví dụ, xem comparing
và thenComparing
ở đây .
Các lớp kiểu cho phép người ta viết các quy tắc như "Nếu A có thứ tự và B có thứ tự, thì bộ của chúng (A, B) cũng có thứ tự". Trong mã, đó là:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
Đó là cách mà sortBy
mã trong mã của chúng ta có thể so sánh theo tên và sau đó theo tuổi. Các ngữ nghĩa đó sẽ được mã hóa bằng "quy tắc" trên. Một lập trình viên Scala sẽ trực giác mong đợi điều này hoạt động theo cách này. Không có phương pháp mục đích đặc biệt nào comparing
phải được thêm vào Ordering
.
Lambdas và các tham chiếu phương thức chỉ là phần nổi của tảng băng trôi đó là lập trình chức năng. :)