【JAVA】使用流进行树形数据构造

436 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

代码

  • 基础的类,使用的可以继承该类补充其他数据
import lombok.Data;

import java.util.List;

/**
 * @description: 树状数据BaseEntity
 * @author: Mr.Kusch
 * @create: 2022-03-17 15:22
 **/
@Data
public class TreeBaseEntity {

    private int id;

    private int parentId;

    private String label;

    private List<? extends TreeBaseEntity> children;

}
  • 工具类
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @description: 构造树工具类
 * @author: Mr.kusch
 * @create: 2022-03-17 15:26
 **/
public class TreeUtil {

    /**
     * 转树工具类
     *
     * @param originData       原数据
     * @param startOriginValue 第一级数据的父id值,一般推荐最上级父ID是0
     * @return java.util.List<? extends com.kusch.ares.tree.TreeBaseEntity>
     * @author Mr.kusch
     * @date 2022/3/17 15:34
     */
    public static List<? extends TreeBaseEntity> generateTree(List<? extends TreeBaseEntity> originData,
                                                              Integer startOriginValue) {
        //过滤出不是一级的数据,并按照parentId进行构造一个map
        Map<Integer, ? extends List<? extends TreeBaseEntity>> childMap =
                originData.stream().filter(node -> node.getParentId() != startOriginValue)
                        .collect(Collectors.groupingBy(TreeBaseEntity::getParentId));
        //便利originData将子数据设置进去,利用了对象之间的浅拷贝
        originData.forEach(item -> item.setChildren(childMap.get(item.getId())));
        //过滤出父id是0的数据返回
        return originData.stream().filter(item -> item.getParentId() == startOriginValue).collect(Collectors.toList());
    }


}

使用

  • 继承基础类
/**
 * @description: 我的树
 * @author: Mr.kusch
 * @create: 2022-03-17 15:38
 **/
@Data
public class MyTree extends TreeBaseEntity {

    private String name;

    private String gender;
}
  • 测试
import cn.hutool.json.JSONUtil;
import com.kusch.ares.tree.TreeUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 测试
 * @author: Mr.kusch
 * @create: 2022-03-17 15:38
 **/
public class Test {

    public static void main(String[] args) {
        List<MyTree> list = new ArrayList<>();

        MyTree myTree1 = new MyTree();
        myTree1.setId(1);
        myTree1.setParentId(0);
        myTree1.setLabel("第一");
        myTree1.setName("张祖宗");
        myTree1.setGender("男");
        list.add(myTree1);

        MyTree myTree2 = new MyTree();
        myTree2.setId(2);
        myTree2.setParentId(1);
        myTree2.setLabel("第一一");
        myTree2.setName("张祖宗下");
        myTree2.setGender("男");
        list.add(myTree2);

        MyTree myTree3 = new MyTree();
        myTree3.setId(3);
        myTree3.setParentId(2);
        myTree3.setLabel("第一一一");
        myTree3.setName("张祖宗下下");
        myTree3.setGender("男");
        list.add(myTree3);

        MyTree myTree4 = new MyTree();
        myTree4.setId(4);
        myTree4.setParentId(3);
        myTree4.setLabel("第一一一一");
        myTree4.setName("张祖宗下下下");
        myTree4.setGender("男");
        list.add(myTree4);

        MyTree myTree5 = new MyTree();
        myTree5.setId(5);
        myTree5.setParentId(0);
        myTree5.setLabel("第二");
        myTree5.setName("谷祖宗");
        myTree5.setGender("女");
        list.add(myTree5);

        MyTree myTree6 = new MyTree();
        myTree6.setId(6);
        myTree6.setParentId(5);
        myTree6.setLabel("第二二");
        myTree6.setName("谷祖宗下");
        myTree6.setGender("女");
        list.add(myTree6);

        System.out.println(JSONUtil.toJsonStr(TreeUtil.generateTree(list,0)));

    }
}
  • 输出结果
[  {    "gender": "男",    "label": "第一",    "parentId": 0,    "children": [      {        "gender": "男",        "label": "第一一",        "parentId": 1,        "children": [          {            "gender": "男",            "label": "第一一一",            "parentId": 2,            "children": [              {                "gender": "男",                "label": "第一一一一",                "parentId": 3,                "name": "张祖宗下下下",                "id": 4              }            ],
            "name": "张祖宗下下",
            "id": 3
          }
        ],
        "name": "张祖宗下",
        "id": 2
      }
    ],
    "name": "张祖宗",
    "id": 1
  },
  {
    "gender": "女",
    "label": "第二",
    "parentId": 0,
    "children": [
      {
        "gender": "女",
        "label": "第二二",
        "parentId": 5,
        "name": "谷祖宗下",
        "id": 6
      }
    ],
    "name": "谷祖宗",
    "id": 5
  }
]