如何使用Collections/Stream API将预约列表转换为带对应预约的医生列表
实现思路
核心逻辑
通过哈希映射(字典)做中间容器归集同个医生的所有预约,避免重复创建Doctor对象,最终把映射的值转为列表返回即可。
具体步骤
- 第一步:初始化一个
Map<String, Doctor>类型的临时映射容器,key使用医生姓名+专科的组合(避免同名不同专科的医生数据归集错误,如果业务侧确认医生姓名唯一可直接用医生姓名做key) - 第二步:遍历输入的所有Appointment对象,每次取出当前预约的
doctorName和speciality生成对应key- 若当前key在映射中不存在:新建Doctor对象,把当前预约的医生姓名、专科赋值给Doctor对应属性,初始化Doctor的appointments列表并把当前预约加进去,最后将该Doctor对象存入映射
- 若当前key在映射中已存在:直接取出映射中对应的Doctor对象,把当前预约加入它的appointments列表即可
- 第三步:遍历完所有预约后,直接取出Map的value集合转为
List<Doctor>就是你需要的doctorList
边界注意事项
- 同一个医生的所有预约的
speciality字段应当一致,如果业务侧存在同个医生跨多个专科出诊的情况,需要调整key规则或者前置校验数据一致性 - 初始化
appointments列表时请使用可变集合,避免添加元素时报不支持操作异常
伪代码参考(Java为例)
// 入参:全院预约列表 List<Appointment> appointmentList public List<Doctor> generateDoctorList(List<Appointment> appointmentList) { Map<String, Doctor> doctorMap = new HashMap<>(); for (Appointment appt : appointmentList) { // 生成唯一key String key = appt.getDoctorName() + "_" + appt.getSpeciality(); if (!doctorMap.containsKey(key)) { Doctor doctor = new Doctor(); doctor.setName(appt.getDoctorName()); doctor.setSpeciality(appt.getSpeciality()); doctor.setAppointments(new ArrayList<>()); doctorMap.put(key, doctor); } // 归集预约 doctorMap.get(key).getAppointments().add(appt); } return new ArrayList<>(doctorMap.values()); }
内容的提问来源于stack exchange,提问作者SKM.CODER
相关产品推荐
相关产品推荐

