You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:19:22