Java代码质量优化提升篇、去重优先选择group by 也可以用distinct 尽量不要用row_number() 函数(会影响工作效率)

91 阅读2分钟

去重优先选择group by
也可以用distinct
尽量不要用row_number() 函数(会影响工作效率)

三者区别
www.cnblogs.com/171207xiaoh…

Java代码质量优化提升篇

请看修改前的代码
是不是好长
但不太复杂

@PostMapping("/list")
    @ApiOperation(value = "竞对分析列表显示")
    public BaseResponse<ReportCompeteListResp> list(@RequestBody ReportCompeteListReq listReq) {
        
        List<CompeteProductResp> competeProductRespList = new ArrayList<CompeteProductResp>();
        List<CompeteProductNoDupResp> competeProductRespNoDupList = new ArrayList<CompeteProductNoDupResp>();
        JiHaiBrandReq jiHaiBrandReq = new JiHaiBrandReq();
        jiHaiBrandReq.setRegionCode(listReq.getRegionCode());
        jiHaiBrandReq.setBrandCodeList(listReq.getBrandCodeList());
        List<JiHaiBrandResp> jiHaiPoiRespList = dataService.listJiHaiBrandDataByBrandCode(jiHaiBrandReq).getData();
        if (CollectionUtil.isNotEmpty(jiHaiPoiRespList)) {
            for (JiHaiBrandResp jiHaiBrandResp : jiHaiPoiRespList) {
                
                CompeteProductResp competeProductResp = new CompeteProductResp();
                String brandName = jiHaiBrandResp.getBrandName();
                if (null != brandName) {
                    competeProductResp.setBrandName(brandName);
                    int count = getCount(jiHaiPoiRespList, brandName);
                    competeProductResp.setCount(Long.valueOf(count));
                    boolean res = competeProductRespList.contains(competeProductResp);
                    if (!res) {
                        competeProductRespList.add(competeProductResp);
                    }
                }
                
                CompeteProductNoDupResp competeProductNoDupResp = new CompeteProductNoDupResp();
                competeProductNoDupResp.setBrandName(jiHaiBrandResp.getBrandName());
                competeProductNoDupResp.setLatitude(jiHaiBrandResp.getLatitude());
                competeProductNoDupResp.setLongitude(jiHaiBrandResp.getLongitude());
                if (null != competeProductNoDupResp) {
                    competeProductRespNoDupList.add(competeProductNoDupResp);
                }
            }
        }
        ReportCompeteListResp reportCompeteListResp = new ReportCompeteListResp();
        
        reportCompeteListResp.setCompeteProductRespList(competeProductRespList);
        
        reportCompeteListResp.setCompeteProductNoDupRespList(competeProductRespNoDupList);
        
        try {
            List<CompeteMarketResp> competeMarketRespList =
                    dataService.getByRegionId(Integer.valueOf(listReq.getRegionCode())).getData();
            reportCompeteListResp.setCompeteMarketRespList(competeMarketRespList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return BaseResponse.ok(reportCompeteListResp);
    }

    private int getCount(List<JiHaiBrandResp> jiHaiPoiRespList, String brandName) {
        int count = 0;
        if (null != brandName) {
            for (JiHaiBrandResp haiBrandResp : jiHaiPoiRespList) {
                if (brandName.equals(haiBrandResp.getBrandName())) {
                    count++;
                }
            }
        }
        return count;
    }

问题:
命名不规范
如CompeteProductNoDupResp 太长了
当数据量过多的时候,List执行效率不高


优化
Map登场
在以远程调用接口listJiHaiBrandDataByBrandCode得到这么一个list
List jiHaiPoiRespList
我们得到的数据就是brandName为key
brandName有统计的,和地图所有详细要展示的longitude、latitude经纬度

解决第一个汇总的,第一种方法是把所有的得到的值都遍历了一遍,很明显数据量大的时候有许多重复的,如1 1 1 2 1 2 3 3 3 3 3 3 3 1 1 1 1 1 数据量多将使得程序非常的慢,浪费时间

根据brandName先分类,在遍历才是王道
把1 1 1 2 1 2 3 3 3 3 3 3 3 1 1 1 1 1
得到key,map在这个时候体现了去重的本质
key只能是唯一的
把list给到value

Map<String, List> jiHaiBrandMap = jiHaiPoiRespList.stream().collect(Collectors.groupingby(JiHaiBrandResp::getBrandName))

Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组

上述代码是根据BrandName来分组的
实现了上述的思路

得到
1 ---------- 原来那个集合by 1
2 ----------- 原来那个集合by 2
3 ------------- 原来那个集合by 3
。。。。。。
而不是把集合所有的东西都拿出来编辑
在外面对key 1 2 3。。。。进行遍历
拿到key
拿到value
遍历
jiHaiBrandMap.forEach((key, value) ->

compterProductResp.setCount((CollectionUtil.isEmpty(value) ? 0 : value.size()));
。。。。。。

)
到这里第一大部统计的完成了
第二三大部还是按以前的来 哈哈哈哈哈 因为第二大部本来就是查详细的避免不了一个个查出的
其实可以优化,但这里作为一个例子不在继续了。
改造后的代码明显质量提高了些

    @PostMapping("/data")
    @ApiOperation(value = "竞对分析列表显示")
    public BaseResponse<ReportCompeteListResp> competeReportData(@RequestBody ReportCompeteListReq listReq) {
        ReportCompeteListResp reportCompeteListResp = new ReportCompeteListResp();
        List<JiHaiBrandResp> jiHaiPoiRespList = getJiHaiBrandResps(listReq);
        if (CollectionUtil.isNotEmpty(jiHaiPoiRespList)) {
            
            reportCompeteListResp.setCompeteProductList(getCompeteProductRespList(jiHaiPoiRespList));
            
            reportCompeteListResp.setCompeteProductDetailList(getCompeteProductDetailResps(jiHaiPoiRespList));
        }
        
        try {
            List<CompeteMarketResp> competeMarketRespList =
                    dataService.getByRegionId(Integer.valueOf(listReq.getRegionCode())).getData();
            reportCompeteListResp.setCompeteMarketRespList(competeMarketRespList);
        } catch (Exception e) {
            log.error("获取商场数据发生异常 e:{}", e);
        }
        return BaseResponse.ok(reportCompeteListResp);
    }

    private List<CompeteProductNoDupResp> getCompeteProductDetailResps(List<JiHaiBrandResp> jiHaiPoiRespList) {
        List<CompeteProductNoDupResp> competeProductRespNoDupList = new ArrayList<CompeteProductNoDupResp>();
        for (JiHaiBrandResp jiHaiBrandResp : jiHaiPoiRespList) {
            
            CompeteProductNoDupResp competeProductNoDupResp = new CompeteProductNoDupResp();
            competeProductNoDupResp.setBrandName(jiHaiBrandResp.getBrandName());
            competeProductNoDupResp.setLatitude(jiHaiBrandResp.getLatitude());
            competeProductNoDupResp.setLongitude(jiHaiBrandResp.getLongitude());
            competeProductRespNoDupList.add(competeProductNoDupResp);
        }
        return competeProductRespNoDupList;
    }

    private List<CompeteProductResp> getCompeteProductRespList(List<JiHaiBrandResp> jiHaiPoiRespList) {
        
        Map<String, List<JiHaiBrandResp>> jiHaiBrandMap = jiHaiPoiRespList.stream()
                .collect(Collectors.groupingBy(JiHaiBrandResp::getBrandName));
        List<CompeteProductResp> competeProductRespList = new ArrayList<CompeteProductResp>();
        jiHaiBrandMap.forEach((key, value) -> {
            CompeteProductResp competeProductResp = new CompeteProductResp();
            competeProductResp.setBrandName(key);
            competeProductResp.setCount((CollectionUtil.isEmpty(value) ? 0 : value.size()));
            competeProductRespList.add(competeProductResp);
        });
        return competeProductRespList;
    }

    private List<JiHaiBrandResp> getJiHaiBrandResps(ReportCompeteListReq listReq) {
        JiHaiBrandReq jiHaiBrandReq = new JiHaiBrandReq();
        jiHaiBrandReq.setRegionCode(listReq.getRegionCode());
        jiHaiBrandReq.setBrandCodeList(listReq.getBrandCodeList());
        List<JiHaiBrandResp> jiHaiPoiRespList = dataService.listJiHaiBrandDataByBrandCode(jiHaiBrandReq).getData();
        return jiHaiPoiRespList;
    }

本文使用 文章同步助手 同步