如何用Java Stream验证所有教师是否在指定时段均有课程?
正确实现方案
原代码问题分析
- 语法错误:
filter(s -> s.getTid() == t -> t.getTid)是无效Lambda表达式,未正确关联list1中的教师ID - 逻辑错误:
anyMatch仅判断是否存在符合条件的元素,但需求是验证所有教师都有对应课程,应使用allMatch
实现思路
- 从
list2中筛选出指定day和time的Session,提取这些Session的Tid存入集合(用Set提升查询效率) - 检查
list1中所有教师的Tid是否都存在于该集合中
正确代码实现
方式一:预处理Session集合(推荐,效率更高)
// 1. 提取指定时段有课的教师ID集合 Set<Integer> occupiedTeacherIds = list2.stream() .filter(s -> day.equals(s.getDay()) && time.equals(s.getTime())) .map(Session::getTid) .collect(Collectors.toSet()); // 2. 验证所有教师ID都在集合内 boolean allTeachersOccupied = list1.stream() .allMatch(teacher -> occupiedTeacherIds.contains(teacher.getTid())); if (allTeachersOccupied) { System.out.println("All teachers are occupied"); } else { System.out.println("Some teachers are free"); }
方式二:嵌套Stream实现(代码简洁,适合小数据量)
boolean allTeachersOccupied = list1.stream() .allMatch(teacher -> list2.stream() .anyMatch(session -> session.getTid().equals(teacher.getTid()) && day.equals(session.getDay()) && time.equals(session.getTime()))); if (allTeachersOccupied) { System.out.println("All teachers are occupied"); } else { System.out.println("Some teachers are free"); }
代码说明
- 方式一通过
Set存储符合条件的教师ID,contains操作时间复杂度为O(1),大数据量场景下性能更优 - 方式二使用嵌套Stream,每个教师需遍历一次list2,时间复杂度为O(n*m),仅适合小数据量
- 若
Tid为包装类型(如Integer),建议用equals替代==比较,避免对象引用判断错误
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

