Java如何优雅的获取多级级联数据
步骤:先查询所有级联的数据,然后通过Java8 Stream 流 来比较和判断,最终生成有顺序的级联数据。
实体类:
package com.macro.mall.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
@AllArgsConstructor
public class LinkageEntities {
private Integer catId; //分类id
private String name; //分类名称
private Integer parentCid; //父分类id
private Integer catLevel; //层级
private Integer sort; //排序
private List<LinkageEntities> children; //子集
}
获取级联集合的业务逻辑代码:
package com.macro.mall.service.impl;
import com.macro.mall.dto.LinkageEntities;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Linkage {
private static List<LinkageEntities> entitiesList = new ArrayList<LinkageEntities>();
static{
entitiesList.add(new LinkageEntities(1,"图书",0,1,0,null));
entitiesList.add(new LinkageEntities(2,"电子",0,1,1,null));
entitiesList.add(new LinkageEntities(3,"衣物",0,1,2,null));
entitiesList.add(new LinkageEntities(4,"英语",1,2,0,null));
entitiesList.add(new LinkageEntities(5,"语文",1,2,1,null));
entitiesList.add(new LinkageEntities(6,"数学",1,2,2,null));
entitiesList.add(new LinkageEntities(7,"手机",2,2,1,null));
entitiesList.add(new LinkageEntities(8,"数码",2,2,2,null));
entitiesList.add(new LinkageEntities(9,"英语上册",4,1,1,null));
entitiesList.add(new LinkageEntities(10,"英语下册",4,1,1,null));
entitiesList.add(new LinkageEntities(11,"英语试卷",4,3,1,null));
entitiesList.add(new LinkageEntities(12,"语文阅读",5,3,2,null));
entitiesList.add(new LinkageEntities(13,"数学试卷",6,3,3,null));
}
public static List<LinkageEntities> listWithTree() {
//1、查询数据库钟,所有的级联信息( 我这里是使用上面的默认数据在测试)
//2、先找到一级父类,再通过级联去查询子类菜单
List<LinkageEntities> topLevel = entitiesList.stream().filter(linkageEntities ->
linkageEntities.getParentCid() == 0 //查询父类
).map((menu)->{
menu.setChildren(getChildrens(menu,entitiesList)); //查询子类菜单
return menu;
}).sorted((menu1,menu2)->{
//排序
return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
}).collect(Collectors.toList());
return topLevel;
}
//递归查找所有菜单的子类菜单
private static List<LinkageEntities> getChildrens(LinkageEntities root,List<LinkageEntities> all){
List<LinkageEntities> children = all.stream().filter(linkageEntities -> {
return linkageEntities.getParentCid() == root.getCatId();
}).map(linkageEntities -> {
//1、递归找到子菜单
linkageEntities.setChildren(getChildrens(linkageEntities,all));
return linkageEntities;
}).sorted((menu1,menu2)->{
//2、菜单的排序
return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
}).collect(Collectors.toList());
return children;
}
public static void main(String[] args) {
System.out.println(listWithTree());
}
}
该案例主要是要熟悉java8 Stream API 的用法。