Resposta JAVA 8 e acima (usando expressões lambda)
No Java 8, expressões Lambda foram introduzidas para tornar isso ainda mais fácil! Em vez de criar um objeto Comparator () com todos os seus andaimes, você pode simplificá-lo da seguinte maneira: (Usando seu objeto como exemplo)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
ou ainda mais curto:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Essa declaração é equivalente ao seguinte:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Pense nas expressões Lambda como exigindo apenas que você insira as partes relevantes do código: a assinatura do método e o que é retornado.
Outra parte da sua pergunta foi como comparar com vários campos. Para fazer isso com expressões Lambda, você pode usar a .thenComparing()
função para combinar efetivamente duas comparações em uma:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
O código acima classificará a lista primeiro por timeStarted
e depois por timeEnded
(para os registros que têm o mesmo timeStarted
).
Uma última observação: é fácil comparar primitivas 'longas' ou 'int', você pode apenas subtrair uma da outra. Se você estiver comparando objetos ('Long' ou 'String'), sugiro que você use a comparação interna. Exemplo:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Obrigado a Lukas Eder por me indicar para .thenComparing()
funcionar.