可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理。
我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。
实体类:Menu.java
/**
* 菜单类
*/
@Data
public class Menu {
public Integer id;
public String name;
public Integer parentId;
public List
方式一:使用stream 流
/**
* 构造数据
* @return
*/
public List
运行结果:
方式二:使用原生的循环递归操作,这里使用iterator循环,设置完数据后移除,可以减少循环数据。
@Test
public void testMenu() {
List menuDatas = getMenuData();
List returnList = Lists.newArrayList();
for (Iterator lt = menuDatas.iterator(); lt.hasNext(); ) {
Menu menu = lt.next();
if (menu.getParentId() == 0) {
returnList.add(menu);
lt.remove();
}
}
returnList.forEach(r -> {
r.setChildList(getChild(r.getId(), menuDatas));
});
System.out.println("菜单树结构:" + JsonUtil.toJson(returnList));
}
private static List getChild(Integer parentId, List menuList) {
List childList = Lists.newArrayList();
for (Iterator lt = menuList.iterator(); lt.hasNext();){
Menu menu = lt.next();
if (parentId.equals(menu.getParentId())) {
childList.add(menu);
lt.remove();
}
}
for (Menu menu : childList) {
List child = getChild(menu.getId(), menuList);
menu.setChildList(child);
}
return childList;
}