java如何根据映射字段的条件使用流过滤一组对象?
我有一个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 楼答案
除非在创建活动时复制地图,否则活动日程将为空。当您清除日程安排时,您是否正在从刚刚添加到事件列表的事件中清除日程安排?因此,当您尝试比较事件时,事件列表中的两个计划都是空的
这是因为每个事件都包含对同一地图的相同引用,您可以同时清除它们
你需要为每个计划声明一个新的地图,但不清除任何内容