1:想要遍历的class都想要继承以下tree
/** * 涉及到层级返回值 的都得继承这个,实体类生成的除外 */ @Data public class TreeModel { /**主键*/ @ApiModelProperty(value = "主键") private java.lang.String id; /**父级节点*/ @ApiModelProperty(value = "父级节点") private String pid; /**是否有子节点*/ @ApiModelProperty(value = "是否有子节点") private String hasChild; @TableField(exist = false) private List<?> data=new ArrayList<>(); }
2:公共方法
/** * 遍历树形结构 * @param thisList 值的list * @param valueList 返回值 * @param pid */ public static <T extends TreeModel> void treeList(List<T> thisList, List<T> valueList,String pid) { // 遍历所有数据,找到根节点菜单 for (T menuDTO : thisList) { if (menuDTO.getPid().equals(pid)) { // 找到根节点菜单的时候,寻找这个根节点菜单下的子节点菜单 findChilds(menuDTO, thisList); // 添加到根节点的列表中 valueList.add(menuDTO); } } } public static <T extends TreeModel> void findChilds(T root, List<T> list){ List<T> childlist=new ArrayList<>(); //遍历所有数据,找到是入参父节点的子节点的数据,然后加到childlist集合中。 for (T menu : list) { if (root.getId().equals(menu.getPid())){ childlist.add(menu); } } //若子节点不存在,那么就不必再遍历子节点中的子节点了 直接返回。 if(childlist.size()==0) return; //设置父节点的子节点列表 root.setData(childlist); //若子节点存在,接着递归调用该方法,寻找子节点的子节点。 for (T childs : childlist) { findChilds(childs, list); } }
一般单表层级结构就是,id,pid,hasChild ,三个字段组成。
一级pid为0 如果有下级hasChild为1 反之为0 而下级pid为上级id
3:使用
层级结构数据commodityCommodityDetailsVos 返回值zuodouCommodityParticularsValieVoList pid看自己需求如果是所有一级以及子级就传0 BaseUtlis.treeList(commodityCommodityDetailsVos,zuodouCommodityParticularsValieVoList,"0");