Java8新特性:使用Stream流遞歸實(shí)現(xiàn)遍歷樹(shù)形結(jié)構(gòu)
可能平常會(huì)遇到一些需求,比如構(gòu)建菜單,構(gòu)建樹(shù)形結(jié)構(gòu),數(shù)據(jù)庫(kù)一般就使用父id來(lái)表示,為了降低數(shù)據(jù)庫(kù)的查詢(xún)壓力,我們可以使用Java8中的Stream流一次性把數(shù)據(jù)查出來(lái),然后通過(guò)流式處理,我們一起來(lái)看看,代碼實(shí)現(xiàn)為了實(shí)現(xiàn)簡(jiǎn)單,就模擬查看數(shù)據(jù)庫(kù)所有數(shù)據(jù)到List里面。
實(shí)體類(lèi):Menu.java
/**
* Menu
*
* @author lcry
*/
@Data
@Builder
public class Menu {
/**
* id
*/
public Integer id;
/**
* 名稱(chēng)
*/
public String name;
/**
* 父id ,根節(jié)點(diǎn)為0
*/
public Integer parentId;
/**
* 子節(jié)點(diǎn)信息
*/
public List遞歸組裝樹(shù)形結(jié)構(gòu):
@Test
public void testtree(){
//模擬從數(shù)據(jù)庫(kù)查詢(xún)出來(lái)
List menus = Arrays.asList(
new Menu(1,"根節(jié)點(diǎn)",0),
new Menu(2,"子節(jié)點(diǎn)1",1),
new Menu(3,"子節(jié)點(diǎn)1.1",2),
new Menu(4,"子節(jié)點(diǎn)1.2",2),
new Menu(5,"根節(jié)點(diǎn)1.3",2),
new Menu(6,"根節(jié)點(diǎn)2",1),
new Menu(7,"根節(jié)點(diǎn)2.1",6),
new Menu(8,"根節(jié)點(diǎn)2.2",6),
new Menu(9,"根節(jié)點(diǎn)2.2.1",7),
new Menu(10,"根節(jié)點(diǎn)2.2.2",7),
new Menu(11,"根節(jié)點(diǎn)3",1),
new Menu(12,"根節(jié)點(diǎn)3.1",11)
);
//獲取父節(jié)點(diǎn)
List collect = menus.stream().filter(m -> m.getParentId() == 0).map(
(m) -> {
m.setChildList(getChildrens(m, menus));
return m;
}
).collect(Collectors.toList());
System.out.println("-------轉(zhuǎn)json輸出結(jié)果-------");
System.out.println(JSON.toJSON(collect));
}
/**
* 遞歸查詢(xún)子節(jié)點(diǎn)
* @param root 根節(jié)點(diǎn)
* @param all 所有節(jié)點(diǎn)
* @return 根節(jié)點(diǎn)信息
*/
private List getChildrens(Menu root, List all) {
List 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;
}
格式化打印結(jié)果:
評(píng)論
圖片
表情
