如何使用Java中的对象ID和LocalDateTime字段正确过滤列表?

时间:2017-05-25 14:17:52

标签: java list arraylist stream

假设我们有跟随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

中的 AS SHOWN

另一件事。所需列表中不能包含具有相同ID的对象。甚至可能有10个具有相同ID的OrderDto个对象,但是选择的一个将是drawDate大于LocalDateTime.now()的第一个

我正在尝试使用Java STREAM来为我做这件事但是遇到了麻烦。 欢迎任何其他解决方案。

1 个答案:

答案 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;
}