<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java8新特性:使用Stream流遞歸實(shí)現(xiàn)遍歷樹(shù)形結(jié)構(gòu)

          共 5015字,需瀏覽 11分鐘

           ·

          2021-04-24 00:02

          可能平常會(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
           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;
              }
              
          }

          遞歸組裝樹(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é)果:

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼123视频 | A片视频网 | 日本爱爱免费视频 | gogo高清无码视频 | A∨在线看 |