如何重构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方法无需修改
原有逻辑完全兼容新的调用方式,不需要做任何调整。
改动说明
- 移除了循环内的
logViolation调用,改为循环结束后统一调用,全程仅执行1次 - 用
StringBuilder拼接所有符合条件的speedType,避免产生多余的中间字符串对象,性能更优 - 所有条目的车辆类型统一存入同一个
TreeSet,保留了原有去重、排序的逻辑 - 保留了空场景校验逻辑,没有有效违规数据时不会触发日志记录,和原有业务行为完全一致
内容的提问来源于stack exchange,提问作者deepankar gautam
相关产品推荐
相关产品推荐

