可能平常會遇到一些需求,比如構建選單,構建樹形結構,資料庫一般就使用父id來表示,為了降低資料庫的查詢壓力,我們可以使用Java8中的Stream流一次性把資料查出來,然后通過流式處理,
我們一起來看看,代碼實作為了實作簡單,就模擬查看資料庫所有資料到List里面,
物體類:Menu.java
/**
* Menu
*
* @author lcry
* @date 2020/06/01 20:36
*/
@Data
@Builder
public class Menu {
/**
* id
*/
public Integer id;
/**
* 名稱
*/
public String name;
/**
* 父id ,根節點為0
*/
public Integer parentId;
/**
* 子節點資訊
*/
public List<Menu> childList;
public Menu(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.childList = childList;
}
}
遞回組裝樹形結構:
@Test
public void testtree(){
//模擬從資料庫查詢出來
List<Menu> menus = Arrays.asList(
new Menu(1,"根節點",0),
new Menu(2,"子節點1",1),
new Menu(3,"子節點1.1",2),
new Menu(4,"子節點1.2",2),
new Menu(5,"根節點1.3",2),
new Menu(6,"根節點2",1),
new Menu(7,"根節點2.1",6),
new Menu(8,"根節點2.2",6),
new Menu(9,"根節點2.2.1",7),
new Menu(10,"根節點2.2.2",7),
new Menu(11,"根節點3",1),
new Menu(12,"根節點3.1",11)
);
//獲取父節點
List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
(m) -> {
m.setChildList(getChildrens(m, menus));
return m;
}
).collect(Collectors.toList());
System.out.println("-------轉json輸出結果-------");
System.out.println(JSON.toJSON(collect));
}
/**
* 遞回查詢子節點
* @param root 根節點
* @param all 所有節點
* @return 根節點資訊
*/
private List<Menu> getChildrens(Menu root, List<Menu> all) {
List<Menu> children = all.stream().filter(m -> {
return Objects.equals(m.getParentId(), root.getId());
}).map(
(m) -> {
m.setChildList(getChildrens(m, all));
return m;
}
).collect(Collectors.toList());
return children;
}
格式化列印結果:

原文鏈接:https://blog.csdn.net/qq_19244927/article/details/106481777/
著作權宣告:本文為CSDN博主「Lcry」的原創文章,遵循CC 4.0 BY-SA著作權協議,轉載請附上原文出處鏈接及本宣告,
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448193.html
標籤:其他
