別再寫(xiě)一堆的 for 循環(huán)了!Java 8 中的 Stream 輕松遍歷樹(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
?*?@date?2020/06/01?20:36
?*/
@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é)果

如果本文對(duì)你有幫助的話(huà),請(qǐng)不要吝嗇你的贊,謝謝!

如有文章對(duì)你有幫助,
“在看”和轉(zhuǎn)發(fā)是對(duì)我最大的支持!
暫時(shí)開(kāi)放微信大號(hào),好友位不多,需要的小伙伴們可以加,朋友圈和交流群里會(huì)發(fā)一些學(xué)習(xí)資料、個(gè)人見(jiàn)解、白嫖課程等等。 掃描下方二維碼即可加我微信啦,2022,抱團(tuán)取暖,一起牛逼。
評(píng)論
圖片
表情

