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

如何重构Java代码使logViolation()仅执行一次并将所有speedType合并为单字符串

重构实现思路

  • 一次性遍历Map所有条目,同时收集两类信息:
    • 所有value非空的条目的speedType值,用于后续拼接为单个字符串
    • 所有非空value中的车辆类型,统一存入同一个TreeSet完成去重排序
  • 遍历完成后,仅当收集到了有效speedType时,才调用一次logViolation方法,传入拼接好的合并字符串和统一收集的车辆类型集合

重构后代码

修改后的checkForViolation方法

private void checkForViolation(
    final LineFeature feature, 
    final DirectionalVehicleTypeRestrictionCollection srSet,
    final Map<String, Collection<String>> setOfVehiclesWithMoreThanOneSpeedRestrictionType
) {
    // 用于拼接所有speedType的缓冲区
    final StringBuilder mergedSpeedTypes = new StringBuilder();
    // 统一收集所有车辆类型,自动去重排序
    final Set<String> mergedVehicleTypes = new TreeSet<>();
    // 分隔符可根据业务需求调整,示例用逗号加空格
    final String separator = ", ";

    for (final Map.Entry<String, Collection<String>> entry : setOfVehiclesWithMoreThanOneSpeedRestrictionType.entrySet()) {
        final String speedType = entry.getKey();
        final Collection<String> value = entry.getValue();
        if (CollectionUtils.isNotEmpty(value)) {
            // 拼接speedType,避免首尾出现多余分隔符
            if (mergedSpeedTypes.length() > 0) {
                mergedSpeedTypes.append(separator);
            }
            mergedSpeedTypes.append(speedType);
            // 合并当前条目的车辆类型
            mergedVehicleTypes.addAll(value);
        }
    }

    // 仅当存在有效违规数据时才调用日志方法,和原有逻辑行为一致
    if (mergedSpeedTypes.length() > 0) {
        logViolation(feature, mergedSpeedTypes.toString(), srSet.getDirection().getTypeShortName(), mergedVehicleTypes);
    }
}

原有logViolation方法无需修改

原有逻辑完全兼容新的调用方式,不需要做任何调整。


改动说明

  1. 移除了循环内的logViolation调用,改为循环结束后统一调用,全程仅执行1次
  2. 用StringBuilder拼接所有符合条件的speedType,避免产生多余的中间字符串对象,性能更优
  3. 所有条目的车辆类型统一存入同一个TreeSet,保留了原有去重、排序的逻辑
  4. 保留了空场景校验逻辑,没有有效违规数据时不会触发日志记录,和原有业务行为完全一致

内容的提问来源于stack exchange,提问作者deepankar gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:54:02