Görev:
Ve alanları peopleolan sınıf nesnelerinin bir listesine sahipsiniz . Sizin göreviniz bu listeyi önce göre sonra da sıralamaktır .Personnameagenameage
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]#sortByyö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 => BBOrderingOrderingComparableComparatorComparableComparatorcomparingthenComparing
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 sortByisme 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 comparingeklenmemiştir Ordering.
Lambdalar ve yöntem referansları, işlevsel programlama olan bir buzdağının sadece bir ucu. :)