实体类
import java.util.Date;
import java.util.List;
/**
* @ClassName FoodClassTree
* @description: 实体类
* @author: 一粒麦子
* @Date 2021/1/20 16:29
**/
public class FoodClassTree {
private static final long serialVersionUID = 1L;
/**
* 唯一标识id
*/
private Long id;
/**
* 类别名称
*/
private String className;
/**
* 父菜单ID
*/
private Long parentId;
/**
* 显示顺序
*/
private Integer orderNum;
List<FoodClassTree> children;
// todo 一下是无参 有参,setter,getter
@Override
public String toString() {
return "FoodClassTree{" +
"id=" + id +
", className='" + className + '\'' +
", parentId=" + parentId +
", orderNum=" + orderNum +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
public FoodClassTree(Long id, String className, Long parentId, Integer orderNum, List<FoodClassTree> children) {
this.id = id;
this.className = className;
this.parentId = parentId;
this.orderNum = orderNum;
this.children = children;
}
public FoodClassTree() {
}
}
递归方法
@Override
public List<FoodClassTree> treeList(HomepensionFoodClass homepensionFoodClass) {
// 查询所有的数据(为方便,我模拟几条数据)
ArrayList<FoodClassTree> allList = new ArrayList<>();
/**
* 分别为 部门id(不重复),部门名称,父id(顶级为0),排序,children
*/
allList.add(new FoodClassTree(1L,"总一部",0L,0,null));
allList.add(new FoodClassTree(2L,"总二部",0L,0,null));
allList.add(new FoodClassTree(3L,"一部一分区",1L,0,null));
allList.add(new FoodClassTree(4L,"一部二分区",1L,0,null));
allList.add(new FoodClassTree(5L,"一部三分区",1L,0,null));
allList.add(new FoodClassTree(6L,"一部一分区一班组",3L,0,null));
// 第一级,过滤parentid为0的,Long用equest判断相等,sorted排序
List<FoodClassTree> collect = allList.stream()
.filter(foodClassTree -> {return foodClassTree.getParentId().equals(0L);})
.map(foodClassTree -> {foodClassTree.setChildren(getChildren(foodClassTree,allList)); return foodClassTree;})
.sorted((menu1,menu2)->{return menu1.getOrderNum()-menu2.getOrderNum();})
.sorted((menu1,menu2)->{return (menu1.getOrderNum()==null?0:menu1.getOrderNum())-(menu2.getOrderNum()==null?0:menu2.getOrderNum());})
.collect(Collectors.toList());
return collect;
}
/**
* 递归方法查找
* @param root 根节点数据(相当于上级)
* @param allList 所有的数据
* @return
*/
private List<FoodClassTree> getChildren(FoodClassTree root, ArrayList<FoodClassTree> allList) {
List<FoodClassTree> collect = allList.stream()
.filter(foodClassTree -> { return foodClassTree.getParentId().equals(root.getId());})
.map(foodClassTree -> {foodClassTree.setChildren(getChildren(foodClassTree,allList)); return foodClassTree;})
.sorted((menu1,menu2)->{return (menu1.getOrderNum()==null?0:menu1.getOrderNum())-(menu2.getOrderNum()==null?0:menu2.getOrderNum());})
.collect(Collectors.toList());
return collect;
}
测试结果
学习
学习来源:哔哩哔哩
参考资料:
先找一级
在递归找
注意
为防止排序码为空报空指针异常
三元运算符:如果为空,让他等于0,否则就等于他本身