多个for循环,解决为null方法
业务需求:参数是各个维度(机构,渠道,产品,客户,日期类型,口径,环节等),名字组合成不同的维度返回
比如前端的参数如下
机构:全机构、东南区(可以选多个也可以不选)
渠道:全渠道(可以选多个也可以不选)
产品:全产品(可以选多个也可以不选)
则要的结果是:全机构-全渠道-全产品、东南区-全渠道-全产品
分析:由于数据不多所以用for嵌套,七个for循环,在最内层创建一个对象接收这些维度,把对象add到一个list集合中返回给前端
难点:这些集合都可以为null,有一个为null就会报异常
解决方法:如果哪个集合为null时,则自定义一个对象,让其不为null;遍历完成后,在剔除掉
代码:
public List<EachDimensionResultDTO> getEachDimensionCards(EachDimension eachDimension){
//上面的参数就是各个维度的集合对象
//最终返回的集合
List<EachDimensionResultDTO> resultDTOList = Lists.newArrayList();
//维度集合可以为NulL,为null时for循环就不能执行下去,所以为null时自定义一个对象,循环为后再替换掉
//自定义一个code和name都为自定义值的对象
EachDimessionItemDTO eachDimenssionDTODefaultNull = new EachDimensionItemDTO("null","null");
//由参数得到产品code集合
List<EachDimensionItemDTO> eachDimensionProduct = eachDimension.getProductCodes();
//为null时加入上面自定义对象
if(CollectionUtils.isEmpty(eachDimensionProduct )){
eachDimensionProduct = new ArrayList();
eachDimensionProduct.add(eachDimenssionDTODefaultNull );
}
//由参数得到机构code集合
。。。。。。(同上)
//由参数得到渠道code集合
。。。。。。(同上)
//定义一个对象接收for循环后的各个维度
EachDimensionResultDTO eachDimensionResultDTO = null;
//卡片组合起来的名字,比如东南区-全渠道-全产品
String ruleName = null;
//把名字放入list中,方便剔除等于“null"的
List<String> ruleNameList = null;
for(EachDimensionItemDTO product:eachDimensionProduct){
for(EachDimensionItemDTO channel:eachDimensionChannel){
for(EachDimensionItemDTO customer:eachDimensionCustomer){
。。。。。。(我总共由七个for循环)
//各个维度组成一个对象
eachDimensionResultDTO = new EachDimensionResultDTO();
//把名字都加入
ruleNameList = new ArrayList<>();
ruleNameList.add(product.getDimensionName);
ruleNameList.add(channel.getDimensionName);
ruleNameList.add(customer.getDimensionName);
。。。。。。(加入其他几个)
//删除名字为”null"的
ruleNameList.romoveIf(name->"null".equals(name));
//把名字用-连接起来
ruleName = String.join("-",ruleNameList);
eachDimensionResultDTO.setRuleName(ruleName);
//code不为“null"时再对code赋值,下面都是这个逻辑
if(!"null".equals(product.getDimensionCode)){
eachDimensionResultDTO.setProductCode(product.getDimensionCode);
}
。。。。。。(下同)
//加入到集合中返回
resultDTOList.add(eachDimensionResultDTO);
}
}
}
}