JAVA 8 y la respuesta anterior (Uso de expresiones Lambda)
¡En Java 8, se introdujeron expresiones Lambda para hacer esto aún más fácil! En lugar de crear un objeto Comparator () con todos sus andamios, puede simplificarlo de la siguiente manera: (Usando su objeto como ejemplo)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
o incluso más corto:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Esa declaración es equivalente a lo siguiente:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Piense en las expresiones de Lambda como algo que solo requiere que ingrese las partes relevantes del código: la firma del método y lo que se devuelve.
Otra parte de su pregunta fue cómo comparar con múltiples campos. Para hacer eso con las expresiones Lambda, puede usar la .thenComparing()
función para combinar efectivamente dos comparaciones en una:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
El código anterior ordenará la lista primero por timeStarted
, y luego por timeEnded
(para aquellos registros que tengan el mismo timeStarted
).
Una última nota: es fácil comparar primitivas 'largas' o 'int', solo puede restar una de la otra. Si está comparando objetos ('Long' o 'String'), le sugiero que use su comparación integrada. Ejemplo:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDITAR: Gracias a Lukas Eder por indicarme que .thenComparing()
funcione.