Как фильтровать с помощью потоков набор объектов на основе критериев для поля карты? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть ArrayList из Event объектов, одно из полей которых равно Map<LocalDateTime, Auditorium> schedule - представляющих расписание события, т.е. когда и в каких аудиториях оно показывается. Реализация Auditorium не важна ради вопроса. Я хочу получить список событий, проходящих между определенными датами / временем. Я написал метод, который должен был просматривать набор дат эфирного события каждого события и фильтровать только те события, для которых хотя бы одна дата эфирного графика находится в заданном временном интервале:

public List<Event> getForDateRange(LocalDateTime from, LocalDateTime to) {
    events.stream()
          .filter(s -> s.getSchedule()
              .keySet()
              .stream()
              .anyMatch(t -> t.compareTo(from) >= 0 && t.compareTo(to) <= 0))
          .collect(Collectors.toList());
}

Затем я пытаюсь проверить метод следующим образом:

List<Event> events = new ArrayList<>();
Map<LocalDateTime, Auditorium> schedule = new HashMap<>();

schedule.put(LocalDateTime.of(2019, 4, 20, 18, 30), auditorium);
schedule.put(LocalDateTime.of(2019, 4, 20, 19, 30), auditorium);
schedule.put(LocalDateTime.of(2019, 4, 20, 20, 30), auditorium);
schedule.put(LocalDateTime.of(2019, 4, 20, 21, 30), auditorium);
Event event1 = new Event("Show1", schedule);
events.add(event1);
schedule.clear();

schedule.put(LocalDateTime.of(2019, 4, 20, 16, 30), auditorium);
schedule.put(LocalDateTime.of(2019, 4, 20, 17, 30), auditorium);
Event event2 = new Event("Show2", schedule);
events.add(event2);
schedule.clear();

LocalDateTime from = LocalDateTime.of(2000, 1, 1, 0, 0);
LocalDateTime to = LocalDateTime.of(2019, 4, 20, 20, 40);

List<Event> result = getForDateRange(from, to);

Я ожидал, что result будет содержать и event1, и event2, однако это пустой список. Что не так с логикой метода?

Спасибо.

1 Ответ

2 голосов
/ 05 июня 2019

Если вы не делаете копию своей карты при создании события, ваши расписания событий будут пустыми. Когда вы очищаете расписание, вы очищаете расписания от событий, которые вы только что добавили в список событий? Поэтому, когда вы пытаетесь сравнить события, оба расписания в списке событий пусты.

Это потому, что каждое событие содержит одну и ту же ссылку на одну и ту же карту, и вы очищаете их обе.

Вам нужно объявить новую карту для каждого расписания и ничего не очищать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...