Java多列分组需求:合并同一incomeChannelCode的logicalUnitCode与logicalUnitIdent
解决方案:合并同一收入渠道下的所有逻辑单元编码与标识
我来帮你搞定这个需求!你当前的代码只合并了同一incomeChannelCode下相同logicalUnitCode的logicalUnitIdent,但现在需要把同一incomeChannelCode下的所有不同logicalUnitCode也合并成逗号分隔的字符串,同时对应的logicalUnitIdent也要一并合并对吧?下面是具体的实现方案:
问题分析
原业务层代码的Collectors.toMap合并逻辑只处理了logicalUnitIdent的拼接,完全忽略了logicalUnitCode的合并需求——当同一incomeChannelCode对应多个不同的logicalUnitCode时,后面的logicalUnitCode会直接覆盖前面的,最终只保留最后一个值,这显然不符合你的预期。
解决方案思路
我们需要修改合并逻辑:在合并两个IncomeChannelCategoryMap对象时,同时对logicalUnitCode和logicalUnitIdent进行去重合并(避免重复的编码或标识)。为了代码整洁,我们可以抽一个工具方法来处理逗号分隔字符串的合并去重逻辑。
完整代码实现
1. 新增合并去重工具方法
在你的业务层类中添加这个工具方法,专门处理逗号分隔字符串的合并与去重:
private String mergeAndDistinct(String existingStr, String newStr) { if (existingStr == null || existingStr.isEmpty()) { return newStr; } if (newStr == null || newStr.isEmpty()) { return existingStr; } // 拆分字符串、去重、重新拼接 Set<String> uniqueValues = new HashSet<>(Arrays.asList(existingStr.split(","))); uniqueValues.addAll(Arrays.asList(newStr.split(","))); return String.join(",", uniqueValues); }
2. 修改后的业务层方法
替换原来的allIncomeChannels方法,在合并逻辑中同时处理logicalUnitCode和logicalUnitIdent:
@Override public List<IncomeChannelCategoryMap> allIncomeChannels(final EntityRequest<IncomeChannel> request) throws ApiException { List<String> lists = request.getEntity().getIncomeChannels(); List<IncomeChannelCategoryMap> channels = incomeChannelMapDAO.allIncomeChannels(lists); return new ArrayList<>(channels.stream().collect(Collectors.toMap( // 以incomeChannelCode作为分组key IncomeChannelCategoryMap::getIncomeChannelCode, // 初始值为对象本身 Function.identity(), // 合并逻辑:同时合并code和ident (final IncomeChannelCategoryMap i1, final IncomeChannelCategoryMap i2) -> { // 合并并去重logicalUnitCode String mergedCode = mergeAndDistinct(i1.getLogicalUnitCode(), i2.getLogicalUnitCode()); i1.setLogicalUnitCode(mergedCode); // 合并并去重logicalUnitIdent String mergedIdent = mergeAndDistinct(i1.getLogicalUnitIdent(), i2.getLogicalUnitIdent()); i1.setLogicalUnitIdent(mergedIdent); return i1; } )).values()); }
逻辑说明
- 工具方法
mergeAndDistinct会把两个逗号分隔的字符串拆分成集合,利用HashSet自动去重,再重新拼接成逗号分隔的字符串,避免出现重复的编码或标识。 - 在
Collectors.toMap的合并函数中,我们同时调用工具方法处理logicalUnitCode和logicalUnitIdent,把合并后的值设置到第一个对象上并返回,确保同一incomeChannelCode下的所有条目都被正确合并。
效果验证
假设DAO层返回的数据如下:
[ {"incomeChannelCode": "DIRECT_SALES", "logicalUnitCode": "R_CATEGORY", "logicalUnitIdent": "7"}, {"incomeChannelCode": "DIRECT_SALES", "logicalUnitCode": "R_TYPE", "logicalUnitIdent": "8"}, {"incomeChannelCode": "DIRECT_SALES", "logicalUnitCode": "R_CATEGORY", "logicalUnitIdent": "7"} // 重复项 ]
经过修改后的代码处理后,会得到你想要的结果:
{"incomeChannelCode": "DIRECT_SALES", "logicalUnitCode": "R_CATEGORY,R_TYPE", "logicalUnitIdent": "7,8"}
内容的提问来源于stack exchange,提问作者None
相关产品推荐
相关产品推荐

