Вы можете обновить свой код как:
private List<Camp> skipByComparison(List<Camp> usersList){
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId()) ?
o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
s.addAll(usersList);
return new ArrayList<>(s);
}
или лучше, вы можете использовать Collectors
и потоки, чтобы решить его как:
private List<Camp> skipByComparisonStream(List<Camp> usersList) {
return new ArrayList<>(usersList.stream()
.collect(Collectors.toMap(c -> c.getUserId().getId(),
Function.identity(),
(a, b) -> a.getCreateDt().after(b.getCreateDt()) ? a : b))
.values());
}
Объяснение : Ваш Comparator
в настоящее время не возвращает никакого значения для случая, когда две даты могут быть equal
, вам, вероятно, следует просто положиться на реализацию compareTo
класса Date
для этого:
Set<Camp> s = new TreeSet<>(new Comparator<Camp>() {
@Override
public int compare(Camp o1, Camp o2) {
return o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0;
}
});
Как только вы это сделаете, вы можете упростить его, используя лямбда-выражение:
Set<Camp> s = new TreeSet<>((o1, o2) -> o1.getUserId().getId().equals(o2.getUserId().getId())
? o1.getCreateDt().compareTo(o2.getCreateDt()) : 0);
Остальное, что я сделал, - это упростил порядок выполнения и очистил избыточную инициализацию.
В сторону : Я только что получил исправление в другом вопросе и рекомендую вам также использовать java.time.LocalDate
для атрибута createDt
.