有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据映射字段的条件使用流过滤一组对象?

我有一个ArrayListEvent对象,其中一个字段是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同时包含event1event2,但是它是一个空列表。该方法的逻辑有什么问题

谢谢


共 (1) 个答案

  1. # 1 楼答案

    除非在创建活动时复制地图,否则活动日程将为空。当您清除日程安排时,您是否正在从刚刚添加到事件列表的事件中清除日程安排?因此,当您尝试比较事件时,事件列表中的两个计划都是空的

    这是因为每个事件都包含对同一地图的相同引用,您可以同时清除它们

    你需要为每个计划声明一个新的地图,但不清除任何内容