6.【原創】使用Java8中的Stream特性篩選數據

package com.fatsea.gulimall.product;

import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@SpringBootTest
class GulimallProductApplicationTests
{

    class Area {
        // 地區編號
        private Integer catId;
        // 地區名稱
        private String name;
        // 地區父ID
        private Integer parentCid;
        // 地區等級:2-省、3-市、4-區縣、5-街道
        private Integer cateLevel;
        // 地區排序值:越小越靠前
        private Integer sort;
        // 子地區
        List<Area> children;

        public Area() {
        }

        public Area(Integer catId, String name, Integer parentCid,Integer sort, Integer cateLevel) {
            this.catId = catId;
            this.name = name;
            this.parentCid = parentCid;
            this.sort = sort;
            this.cateLevel = cateLevel;
        }

        public Integer getCatId() {
            return catId;
        }

        public void setCatId(Integer catId) {
            this.catId = catId;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getParentCid() {
            return parentCid;
        }

        public void setParentCid(Integer parentCid) {
            this.parentCid = parentCid;
        }

        public Integer getCateLevel() {
            return cateLevel;
        }

        public void setCateLevel(Integer cateLevel) {
            this.cateLevel = cateLevel;
        }

        public Integer getSort() {
            return sort;
        }

        public void setSort(Integer sort) {
            this.sort = sort;
        }

        public List<Area> getChildren() {
            return children;
        }

        public void setChildren(List<Area> children) {
            this.children = children;
        }
    }

    @Test
    void testDataFilter ()
    {
        // 準備數據
        List<Area> allArea = new ArrayList<>();
        allArea.add(new Area(1, "江西",0, 14, 2));
        allArea.add(new Area(2, "湖北",0, 13, 2));
        allArea.add(new Area(3, "湖南",0, 12, 2));
        allArea.add(new Area(4, "九江",1, 11, 3));
        allArea.add(new Area(5, "南昌",1, 10, 3));
        allArea.add(new Area(6, "景德鎮",1, 9, 3));
        allArea.add(new Area(7, "浮樑",6, 8, 3));
        allArea.add(new Area(8, "昌江",6, 7, 3));
        allArea.add(new Area(9, "樂平",6, 6, 3));
        allArea.add(new Area(10, "東湖區",5, 5, 4));
        allArea.add(new Area(11, "南昌縣",5, 4, 4));
        allArea.add(new Area(12, "新建縣",5, 3, 4));
        allArea.add(new Area(13, "柴桑區",4, 2, 4));
        allArea.add(new Area(14, "塔山街道",9, 1, 5));

        // 篩選出省級地區:並排序
        List<Area> provinceList = allArea.stream()
                .filter(area -> area.getCateLevel() == 2)
                .map((province) -> {
                    // 針對單個省設置子級地區
                    province.setChildren(getChildrens(province, allArea));
                    return province;
                }).sorted((province1, province2) -> {
                    return province1.getSort() - province2.getSort();
                }).collect(Collectors.toList());

        // 打印結果
        System.out.println("areaList:" + JSON.toJSONString(provinceList));
        /*[
            {"catId":3,"cateLevel":2,"name":"湖南","parentCid":0,"sort":12,"children":[]},
            {"catId":2,"cateLevel":2,"name":"湖北","parentCid":0,"sort":13,"children":[]},
            {"catId":1,"cateLevel":2,"name":"江西","parentCid":0,"sort":14,"children":
                [
                    {"catId":6,"cateLevel":3,"name":"景德鎮","parentCid":1,"sort":9,"children":
                        [
                            {"catId":9,"cateLevel":3,"name":"樂平","parentCid":6,"sort":6,"children":
                                    [
                                        {"catId":14,"cateLevel":5,"children":[],"name":"塔山街道","parentCid":9,"sort":1}
                                    ]
                            },
                            {"catId":8,"cateLevel":3,"children":[],"name":"昌江","parentCid":6,"sort":7},
                            {"catId":7,"cateLevel":3,"children":[],"name":"浮樑","parentCid":6,"sort":8}
                        ]
                    },
                    {"catId":5,"cateLevel":3,"name":"南昌","parentCid":1,"sort":10,"children":
                        [
                            {"catId":12,"cateLevel":4,"name":"新建縣","parentCid":5,"sort":3,"children":[]},
                            {"catId":11,"cateLevel":4,"name":"南昌縣","parentCid":5,"sort":4,"children":[]},
                            {"catId":10,"cateLevel":4,"name":"東湖區","parentCid":5,"sort":5,"children":[]}
                        ]
                    },
                    {"catId":4,"cateLevel":3,"name":"九江","parentCid":1,"sort":11,"children":
                        [
                            {"catId":13,"cateLevel":4,"name":"柴桑區","parentCid":4,"sort":2,"children":[]}
                        ]
                    }
                ]
            }
        ]*/
    }

    // 遞歸篩選每個省級地區的子級
    public List<Area> getChildrens (Area root, List<Area> allArea) {
        // 篩選子級
        List<Area> children = allArea.stream()
                // 篩選出當前地區的下一級
                .filter(area -> root.getCatId() == area.getParentCid())
                // 嵌套,遞歸查找下一級地區
                .map((area) -> {
                    area.setChildren(getChildrens(area, allArea));
                    return area;
                // 排序
                }).sorted((area1, area2) -> {
                    return area1.getSort() - area2.getSort();
                }).collect(Collectors.toList());
        return children;
    }
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章