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

@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));
// 竟对品牌poi列表数据
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) {
// 根据品牌code进行分组
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;
}