创建树公共接口/***树公共接口*需要打包成树结构的实体继承此类并添加List子属性**@authorjinlong*@date2019-06-28*/publicinterfaceTreeMixin{/***获取子节点**@returnList*/ListgetChildren();/***设置子节点**@paramchildren子节点列表*/voidsetChildren(Listchildren);/***添加子节点**@paramchild子节点*/defaultvoidaddChild(Tchild){Listchildren=getChildren();if(children==null){children=newArrayList<>();}children.add(child);}}创建并返回树结构实体类@DatapublicclassDepartDtoimplementsTreeMixin{/***DepartDto的唯一标识符*/privateStringkey;私人长号;私有字符串名称;/***可以是员工ID或部门代码*/privateStringcode;私人长父母;/***子部门*/privateListchildren=newArrayList<>();@覆盖publicListgetChildren(){返回孩子;}@OverridepublicvoidsetChildren(Listchildren){this.children=children;}/****@paramdepart*/publicvoidfillDepart(Departmentdepart){this.setKey("d"+depart.getId());this.setName(depart.getName());this.setParentId(depart.getParentId());this.setId(depart.getId());}创建树辅助类/***树辅助类**@param节点类型*@paramid类型*@authorjinlong*@date2019-06-28*/publicclassTreeUtil{/***id获取方式*/privateFunctionidGetter;/***父节点id获取方式*/privateFunctionparentIdGetter;publicTreeUtil(FunctionidGetter,FunctionparentIdGetter){this.idGetter=idGetter;this.parentIdGetter=parentIdGetter;}/***转换为树结构**@return*/publicTbuildTree(Listlist,Troot){Listchildren=buildTreeList(list,idGetter.apply(root));root.setChildren(孩子);返回根;}/***构建树**@paramlist待转化的数据列表*@return*/publicListbuildTreeList(Listlist,RrootId){ArrayListdest=newArrayList<>(Collections.nCopies(list.size(),null));Collections.copy(dest,列表);MapidItemsMap=dest.stream().collect(Collectors.toMap(item->idGetter.apply(item),item->item));dest.forEach(item->{RparentId=parentIdGetter.apply(item);Optional.ofNullable(idItemsMap.get(parentId)).ifPresent(parent->parent.addChild(item));});返回dest.stream().peek(d->{if(CollectionUtils.isEmpty(d.getChildren())){d.setChildren(null);}}).filter(matchParentId(rootId)).collect(Collectors.toList());}privatePredicatematchParentId(RparentId){返回项目->Objects.equals(parentIdGetter.apply(item),parentId);}}get树形结构的具体方法就是具体过程。获取什么数据需要根据自己的业务获取/***查询组织结构数据(部门加员工)*@paramonlyWorking是否只查询工作的*@return*/publicDepartDtotreeHasEmployee(BooleanonlyWorking){//获取所有部门列表Listlist=findAll();//获取根部门DepartmentrootDept=findRoot();//获取根部门idLongrootId=rootDept.getId();//创建树形结构数据对象DepartDtoroot=newDepartDto();//获取所有员工ListuserList=workInfoService.list();//创建一个和employee集合一样大小的集合,泛型为树形结构EntityclassListdtoList=Lists.newArrayListWithExpectedSize(userList.size());//实体类userList.forEach(u->{DepartDtodto=newDepartDto();dto.setKey(u.getId().toString());dto.setName(u.getName());dto.setParentId(u.getDepartmentId());dto.setId(u.getId());dto.setCode(u.getJobNumber());dtoList.add(dto);});//将部门集合转化为树形结构的实体类for(Departmentd:list){//判断是否为根节点if(d.getId().equals(rootId)){//将数据转化为根节点的树结构,什么都不做root.fillDepart(d);}else{//将子节点的数据转成树结构,加入到dtoList中DepartDtodto=newDepartDto();dto.fillDepart(d);dtoList.add(dto);}}//创建树工具类对象,调用树工具全参构造方法。参数为://@paramgetId方法获取数据id方法//@paramgetParentId方法获取父id方法TreeUtiltreeUtil=newTreeUtil<>(DepartDto::getId,DepartDto::getParentId);//调用树工具类的buildTree方法参数为//@paramdtoList所有子节点集合一般都是树形结构的实体类//@paramrootrootdepartmentr返回treeUtil.buildTree(dtoList,root);