자바 8 이상 답변 (람다 식 사용)
Java 8에서는 Lambda 표현식이 도입되어 더욱 쉬워졌습니다! 모든 스캐 폴딩으로 Comparator () 객체를 만드는 대신 다음과 같이 단순화 할 수 있습니다. (객체를 예제로 사용)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
또는 더 짧게 :
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
그 진술은 다음과 같습니다.
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Lambda 표현식은 코드의 관련 부분 (메소드 서명 및 반환되는 항목) 만 입력하면된다고 생각하십시오.
질문의 또 다른 부분은 여러 필드와 비교하는 방법이었습니다. Lambda 표현식으로이를 수행하려면이 .thenComparing()
함수를 사용 하여 두 비교를 하나로 결합 할 수 있습니다 .
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
위의 코드는 목록을 먼저 정렬 timeStarted
한 다음 timeEnded
(같은 레코드에 대해) 정렬합니다 timeStarted
.
마지막 참고 사항 : 'long'또는 'int'프리미티브를 쉽게 비교할 수 있습니다. 서로를 빼면됩니다. 객체 ( 'Long'또는 'String')를 비교하는 경우 기본 제공 비교를 사용하는 것이 좋습니다. 예:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
편집 : .thenComparing()
기능을 알려주는 Lukas Eder에게 감사드립니다 .