如何封装两级属性结构数据?

这里以大科室和小科为例子,并使用stream流的方式封装
在这里插入图片描述

创建一个你需要封装成什么结构的vo封装对象

  • 封装vo对象
@Data
@ApiModel(description = "Department")
public class DepartmentVo {
    
    

	@ApiModelProperty(value = "科室编号")
	private String depcode;

	@ApiModelProperty(value = "科室名称")
	private String depname;

	@ApiModelProperty(value = "下级节点")
	private List<DepartmentVo> children;

}
  • 控制器
@RestController
@RequestMapping("/admin/hosp/department")
public class DepartmentController {
    
    

    @Autowired
    private DepartmentService departmentService;

    //根据医院编号,查询医院所有科室列表
    @GetMapping("/getDeptList/{hoscode}")
    public Result getDeptList(@PathVariable String hoscode){
    
    
        List<DepartmentVo> list = departmentService.findDeptTree(hoscode);
        return Result.ok(list);
    }

}
  • 接口
    根据医院编号,查询医院所有科室列表
    List<DepartmentVo> findDeptTree(String hoscode);

1、先创建一个用于封装返回的最终数据的list集合

2、根据对应的条件,获取到装有所有数据的list集合
(下面使用的mongoDB所有就先new了对应的实体类,封装了下对应的code,查询获取到所有数据的集合)

3、使用List中的stream流进行分类(Department::getBigcode),根据Department实体类中的Bigcode属性进行分类,获取到分类后的KV键值对的Map,K是Bigcode(大科室编号),V是所有数据,包含大科室和小科室
------------------------一层遍历------------------------
4、遍历分类后的map集合,这里采用获取到Map中的entry对象,获取到KV
5、K为大科室的编号,V为大科室编号对应的全部数据(包含这个大科室+对应小科室的全部数据)
6、new一个上面对应你想要封装成的结构对象,封装除了小科室意外的别的数据,并等待一会装接下来小科室封装后的list集合
7、new一个用来封装小科室的list集合
_------------------二层遍历-----------------------
8、上面map集合中,再遍历包含大科室所有数据的list集合
9、在遍历中new一个上面你对应你想要封装成的结构对象,并用来封装小科室
10、封装对应的值,并将其加入到上面,封装大科室数据的结构对象中
_--------------------二层遍历----------------------
11、将二层遍历中封装好的结构对象,设置到到一层遍历中的结构对象中的child属性中
12、将一层遍历对象加入到最终的封装对象的list集合中
_---------------------一层遍历--------------------------
13、返回最终封装的list集合

  • impl
//根据医院编号,查询医院所有科室列表
    //根据医院编号,查询医院所有科室列表
    @Override
    public List<DepartmentVo> findDeptTree(String hoscode) {
    
    
        //创建list集合,用于封装最终的数据
        ArrayList<DepartmentVo> resultList = new ArrayList<>();
        //根据医院编号,查询医院所有科室信息
        Department department = new Department();
        department.setHoscode(hoscode);
        Example<Department> example = Example.of(department);
        //所有科室列表信息
        List<Department> departmentList = departmentRepository.findAll(example);

        //根据大科室编号 分组
        Map<String, List<Department>> departmentMap = departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
        //遍历map集合
        for (Map.Entry<String,List<Department>> entry : departmentMap.entrySet()){
    
    
            //大科室编号
            String bigCode = entry.getKey();
            //大科室编号对应的全部数据
            List<Department> bigCodeList = entry.getValue();

            //封装大科室
            DepartmentVo departmentVo = new DepartmentVo();
            departmentVo.setDepcode(bigCode);
            departmentVo.setDepname(bigCodeList.get(0).getBigname());

            //封装小科室
            List<DepartmentVo> child = new ArrayList<>();
            for (Department department1 : bigCodeList) {
    
    
                //遍历大科室数据中的所有小科室
                DepartmentVo departmentVo1 = new DepartmentVo();
                departmentVo1.setDepcode(department1.getDepcode());
                departmentVo1.setDepname(department1.getDepname());
                //封装小科室
                child.add(departmentVo1);
            }
            //把小科室list集合放到大科室child对象中
            departmentVo.setChildren(child);

            //放入最终的返回集合中
            resultList.add(departmentVo);
        }

        return resultList;
    }

这样子就可以封装二级的树形结构的数据,并以上的json形式返回

猜你喜欢

转载自blog.csdn.net/qq_43284469/article/details/115255256