JAVA 8 e successive risposte (utilizzando espressioni lambda)
In Java 8, le espressioni Lambda sono state introdotte per renderlo ancora più semplice! Invece di creare un oggetto Comparator () con tutte le sue impalcature, puoi semplificarlo come segue: (Usando il tuo oggetto come esempio)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
o anche più breve:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Quell'affermazione equivale alla seguente:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Pensa alle espressioni Lambda che richiedono solo di inserire le parti pertinenti del codice: la firma del metodo e ciò che viene restituito.
Un'altra parte della tua domanda era come confrontare più campi. Per fare ciò con le espressioni Lambda, puoi usare la .thenComparing()
funzione per combinare efficacemente due confronti in uno:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Il codice sopra ordinerà prima l'elenco per timeStarted
, quindi per timeEnded
(per quei record che hanno lo stesso timeStarted
).
Un'ultima nota: è facile confrontare le primitive 'lunghe' o 'int', puoi semplicemente sottrarre l'una dall'altra. Se stai confrontando oggetti ('Long' o 'String'), ti suggerisco di usare il loro confronto integrato. Esempio:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Grazie a Lukas Eder per avermi indicato la .thenComparing()
funzione.