1. 程式人生 > 其它 >Java封裝樹形結構資料

Java封裝樹形結構資料

業務場景
進行業務開發時,有時前端需要一個樹形導航選單,或者分類選單,這樣就需要後端把資料封裝成一個樹形結構。比較常見的像導航選單、省市區級聯等。
在此模擬一個類似場景,查詢部門資訊,並且存在上下級。

實體類
實體類中使用parentCode來實現資料關聯。

/**
 * @author Yoko
 * @date 2021/10/28
 */
@Data
@Builder
public class Department {
    /**
     * 公司編碼
     */
    private Integer companyCode;
    /**
     * 部門名稱
     */
    private String name;

    /**
     * 部門編碼
     */
    private Integer code;

    /**
     * 上級部門編碼
     */
    private Integer parentCode;

    /**
     * 部門下所管轄部門
     */
    private List<Department> children;
}

業務實現

public static void main(String[] args) {
         // 查詢公司下所有部門資訊
        List<com.hqins.ishare.user.demo.Department> departmentList = departmentListByCompanyCode();
        // 使用filter()過濾,獲取最上層部門
        List<com.hqins.ishare.user.demo.Department> result = departmentList.stream().filter(depart -> 0 == depart.getParentCode())
                // 使用peek() 為上級部門新增下級部門
                .peek(depart -> depart.setChildren(createChildList(depart, departmentList)))
                // 排序
                .sorted(Comparator.comparing(com.hqins.ishare.user.demo.Department:: getCode))
                // 收集資料至list
                .collect(Collectors.toList());
        System.out.println(JSONObject.toJSONString(result));

    }
    /**
     * 遞迴獲取
     * 根據當前部門,獲取其子部門
     */
    private static List<com.hqins.ishare.user.demo.Department> createChildList(com.hqins.ishare.user.demo.Department father, List<com.hqins.ishare.user.demo.Department> list) {
        return list.stream().filter(model -> father.getCode().equals(model.getParentCode()))
                .peek(model -> model.setChildren(createChildList(model, list)))
                .sorted(Comparator.comparing(com.hqins.ishare.user.demo.Department:: getCode))
                .collect(Collectors.toList());
    }

    /**
     * 模擬資料庫查詢
     * 根據公司編碼獲取公司所有部門資訊
     */
    private static List<com.hqins.ishare.user.demo.Department> departmentListByCompanyCode() {
        List<com.hqins.ishare.user.demo.Department> result = new ArrayList<>();
        com.hqins.ishare.user.demo.Department model1 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("技術部").code(10000).parentCode(0).build();
        com.hqins.ishare.user.demo.Department model2 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("java開發部").code(10001).parentCode(10000).build();
        com.hqins.ishare.user.demo.Department model3 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("前端技術部").code(10002).parentCode(10000).build();
        com.hqins.ishare.user.demo.Department model4 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事部").code(10003).parentCode(0).build();
        com.hqins.ishare.user.demo.Department model5 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事一部").code(10004).parentCode(10003).build();
        com.hqins.ishare.user.demo.Department model6 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事二部").code(10005).parentCode(10003).build();
        result.add(model1);
        result.add(model2);
        result.add(model3);
        result.add(model4);
        result.add(model5);
        result.add(model6);
        return result;
    }

資料結果

[{
	"children": [{
		"children": [],
		"code": 10001,
		"companyCode": 10086,
		"name": "java開發部",
		"parentCode": 10000
	}, {
		"children": [],
		"code": 10002,
		"companyCode": 10086,
		"name": "前端技術部",
		"parentCode": 10000
	}],
	"code": 10000,
	"companyCode": 10086,
	"name": "技術部",
	"parentCode": 0
}, {
	"children": [{
		"children": [],
		"code": 10004,
		"companyCode": 10086,
		"name": "人事一部",
		"parentCode": 10003
	}, {
		"children": [],
		"code": 10005,
		"companyCode": 10086,
		"name": "人事二部",
		"parentCode": 10003
	}],
	"code": 10003,
	"companyCode": 10086,
	"name": "人事部",
	"parentCode": 0
}]
學習是一個循序漸進的過程,而學習的時間從來都不晚,只要你開始學習。