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
}]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM