假设我们有跟随Dto模型。
public class OrderDto {
Long id;
LocalDateTime drawDate;
}
我们需要跟踪List
我需要过滤的内容,并且还包含了我需要的结果。
List<OrderDto> orderDtoList = new ArrayList<>();
orderDtoList.add(new OrderDto(1L, LocalDateTime.now())); // 1
orderDtoList.add(new OrderDto(1L, LocalDateTime.now().plusDays(1))); // 2
orderDtoList.add(new OrderDto(1L, LocalDateTime.now().plusDays(2))); // 3
orderDtoList.add(new OrderDto(2L, LocalDateTime.now().minusDays(1))); // 4
orderDtoList.add(new OrderDto(2L, LocalDateTime.now())); // 5
orderDtoList.add(new OrderDto(2L, LocalDateTime.now().plusDays(1))); // 6
orderDtoList.add(new OrderDto(2L, LocalDateTime.now().plusDays(2))); // 7
orderDtoList.add(new OrderDto(3L, LocalDateTime.now().minusDays(2))); // 8
orderDtoList.add(new OrderDto(3L, LocalDateTime.now().minusDays(1))); // 9
orderDtoList.add(new OrderDto(3L, LocalDateTime.now())); // 10
List<OrderDto> desiredList = new ArrayList<>();
desiredList.add(new OrderDto(1L, LocalDateTime.now().plusDays(1))); // 2
desiredList.add(new OrderDto(2L, LocalDateTime.now().plusDays(1))); // 6
desiredList.add(new OrderDto(3L, LocalDateTime.now())); // 10
正如您所看到的,我们有几个具有相同ID的OrderDto
个对象,但我需要在所需列表中包含drawDate
多个LocalDateTime.now()
的对象。 但只有第一个大于LocalDateTime.now()
的对象。显然我需要plusDays(1)
而不是plusDays(2)
的对象。期望列表中不能包含具有相同ID的对象。
也很重要。如果 SAME ID 的对象的drawDate
大于LocalDatetime.now()
。然后我需要选择具有最新drawDate
的对象。 desiredList
另一件事。所需列表中不能包含具有相同ID的对象。甚至可能有10个具有相同ID的OrderDto
个对象,但是选择的一个将是drawDate
大于LocalDateTime.now()
的第一个
我正在尝试使用Java STREAM来为我做这件事但是遇到了麻烦。 欢迎任何其他解决方案。
答案 0 :(得分:1)
我已经找到了一种能够为我完成工作的方法。如果有人在那里可以想到更好的东西随意张贴。我使用排序因为list可能没有按drawDates排序,所以我只是确保在从中提取任何元素之前对它进行排序。它保证我得到正确的。然后我反向列表以获得第一个对象,其中最近的日期为LocalDateTime.now()
。
private List<OrderDto> getFilteredList(List<OrderDto> orderDtoList) {
List<OrderDto> filteredList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
List<OrderDto> sortedList = orderDtoList.stream().sorted(Comparator.comparing(OrderDto::getDrawDate)).collect(Collectors.toList());
for (OrderDto dto : sortedList) {
if (dto.getDrawDate().isAfter(now) && filteredList.stream().noneMatch(orderDto -> Objects.equals(orderDto.getId(), dto.getId()))) {
filteredList.add(dto);
}
}
Collections.reverse(sortedList);
for (OrderDto dto : sortedList) {
if (dto.getDrawDate().isBefore(now) && filteredList.stream().noneMatch(orderDto -> Objects.equals(orderDto.getId(), dto.getId()))) {
filteredList.add(dto);
}
}
return filteredList;
}