Odpowiedź JAVA 8 i wyżej (przy użyciu wyrażeń lambda)
W Javie 8 wprowadzono wyrażenia Lambda, aby było to jeszcze łatwiejsze! Zamiast tworzyć obiekt Comparator () z całym jego szkieletem, możesz go uprościć w następujący sposób: (Używając swojego obiektu jako przykładu)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
lub jeszcze krócej:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
To jedno stwierdzenie jest równoważne z następującym:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Pomyśl o wyrażeniach Lambda jako wymagających jedynie umieszczenia odpowiednich części kodu: podpisu metody i tego, co zostanie zwrócone.
Inną częścią twojego pytania było to, jak porównać z wieloma polami. Aby to zrobić z wyrażeniami Lambda, możesz użyć .thenComparing()
funkcji, aby skutecznie połączyć dwa porównania w jedno:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Powyższy kod posortuje listę najpierw według timeStarted
, a następnie według timeEnded
(dla tych rekordów, które mają to samo timeStarted
).
Ostatnia uwaga: łatwo jest porównać prymitywy „długie” lub „int”, wystarczy odjąć jeden od drugiego. Jeśli porównujesz obiekty („Long” lub „String”), sugeruję skorzystanie z ich wbudowanego porównania. Przykład:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDYCJA: Dziękuję Lukasowi Ederowi za wskazanie mi .thenComparing()
funkcji.