You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream验证所有教师是否在指定时段均有课程?

正确实现方案

原代码问题分析

  • 语法错误:filter(s -> s.getTid() == t -> t.getTid) 是无效Lambda表达式,未正确关联list1中的教师ID
  • 逻辑错误:anyMatch 仅判断是否存在符合条件的元素,但需求是验证所有教师都有对应课程,应使用allMatch

实现思路

  1. 从list2中筛选出指定day和time的Session,提取这些Session的Tid存入集合(用Set提升查询效率)
  2. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:40:28