別再寫一堆的 for 循環(huán)了!Java 8 中的 Stream 輕松遍歷樹(shù)形結(jié)構(gòu),是真的牛逼!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
可能平常會(huì)遇到一些需求,比如構(gòu)建菜單,構(gòu)建樹(shù)形結(jié)構(gòu),數(shù)據(jù)庫(kù)一般就使用父id來(lái)表示,為了降低數(shù)據(jù)庫(kù)的查詢壓力,我們可以使用Java8中的Stream流一次性把數(shù)據(jù)查出來(lái),然后通過(guò)流式處理。
?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));}/**?*?遞歸查詢子節(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é)果:" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2"> /**
?*?Menu
?*
?*?@author?lcry
?*?@date?2020/06/01?20:36
?*/
????@Data
????@Builder
????public?class?Menu?{
????/**
?????*?id
?????*/
?????public?Integer?id;
?????/**
?????*?名稱
?????*/
?????public?String?name;
?????/**
?????*?父id?,根節(jié)點(diǎn)為0
?????*/
?????public?Integer?parentId;
?????/**
?????*?子節(jié)點(diǎn)信息
?????*/
?????public?List?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?childList)?{
????????this.id?=?id;
????????this.name?=?name;
????????this.parentId?=?parentId;
????????this.childList?=?childList;
????}
}
?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));}/**?*?遞歸查詢子節(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é)果:" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2"> @Test
public?void?testtree(){
????//模擬從數(shù)據(jù)庫(kù)查詢出來(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));
}
/**
?*?遞歸查詢子節(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;
}

原文鏈接:https://blog.csdn.net/qq_19244927/article/details/106481777/
版權(quán)聲明:本文為CSDN博主「Lcry」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

關(guān)注Java技術(shù)??锤喔韶?/strong>

評(píng)論
圖片
表情

