Görev:
Ve alanları people
olan sınıf nesnelerinin bir listesine sahipsiniz . Sizin göreviniz bu listeyi önce göre sonra da sıralamaktır .Person
name
age
name
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))
Güncelleme
Bu cevabı yazdığımdan beri epey ilerleme oldu. Lambdalar (ve yöntem referansları) sonunda Java'ya indi ve Java dünyasını fırtınaya sürüklüyorlar.
Java 8 ile yukarıdaki kod şöyle görünecektir (@fredoverflow tarafından katkıda bulunmuştur):
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Bu kod neredeyse kısa olmasına rağmen Scala kodu kadar zarif çalışmıyor.
Scala çözümde, Seq[A]#sortBy
yöntem, bir işlevi kabul etmek gereklidir sahip bir . bir tür sınıfıdır. Her iki dünyayı da en iyi şekilde düşünün: Söz konusu tür için örtüktür, ancak genişletilebilir ve ona sahip olmayan türlere geriye dönük olarak eklenebilir. Java, tür sınıfları içermediğinden, bu tür her yöntemi bir kez , sonra da için çoğaltması gerekir . Örneğin, bakın ve buraya .A => B
B
Ordering
Ordering
Comparable
Comparator
Comparable
Comparator
comparing
thenComparing
Tür sınıfları, "A'nın sıralaması ve B'nin sıralaması varsa, o zaman tuple (A, B) de sıralaması vardır" gibi kurallar yazmasına izin verir. Kodda, yani:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
Bu, kodumuzda sortBy
isme göre ve sonra yaşa göre karşılaştırabilir. Bu anlambilim yukarıdaki "kural" ile kodlanacaktır. Bir Scala programcısı sezgisel olarak bunun bu şekilde çalışmasını beklerdi. Buna benzer özel amaçlı yöntemler comparing
eklenmemiştir Ordering
.
Lambdalar ve yöntem referansları, işlevsel programlama olan bir buzdağının sadece bir ucu. :)