java - 我如何重构此代码以仅执行一次方法 logViolation() 并在单个字符串中获取字符串变量 (speedType) 的所有值
问题描述
如何重构下面的代码以仅执行一次方法并在单个字符串中logViolation()
获取字符串变量的所有值?speedType
private void checkForViolation(
final LineFeature feature,
final DirectionalVehicleTypeRestrictionCollection srSet,
final Map<String, Collection<String>> setOfVehiclesWithMoreThanOneSpeedRestrictionType
) {
for (final Entry<String, Collection<String>> entry : setOfVehiclesWithMoreThanOneSpeedRestrictionType.entrySet()) {
final String speedType = entry.getKey();
final Collection<String> value = entry.getValue();
if (CollectionUtils.isNotEmpty(value)) {
final Set<String> set = new TreeSet<>();
set.addAll(value);
logViolation(feature, speedType, srSet.getDirection().getTypeShortName(), set);
}
}
}
private void logViolation(
final LineFeature feature, final String speedRestrictionType,
final String direction, final Set<String> vehicleTypesSet
) {
final ViolationVariableSpeedInfo viva = new ViolationVariableSpeedInfo(
ViolationVariableKey.SPEED_INFO.getKey(),
speedRestrictionType, vehicleTypesSet, direction
);
getRuleContext().logViolation(feature, viva);
}
解决方案
如果输入映射中的所有键都setOfVehiclesWithMoreThanOneSpeedRestrictionType
需要合并到一个字符串中,并且该映射中的所有值都应该合并到一个字符串中TreeSet
然后记录,这可以简单地实现为:
private void checkForViolation(
final LineFeature feature,
final DirectionalVehicleTypeRestrictionCollection srSet,
final Map<String, Collection<String>> map
) {
String speedType = String.join(", ", map.keySet());
TreeSet<String> set = map.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toCollection(TreeSet::new));
logViolation(feature, speedType, srSet.getDirection().getTypeShortName(), set);
}
推荐阅读
- kotlin - 如何在 Kotlin 中使用运算符重载将数字除以数字向量
- c++ - 分配器感知`std::array`风格的容器?
- install4j - 如何使用 install4j 更改(默认)的注册表值
- rust - 是否有任何机制可以使用 Rust 或 Rust 工具生成“所有权树”可视化?
- microcontroller - 如何为 c8051f340 编写 Keil-c51 和 Simplicity Studio?
- javascript - 如何选择具有(任何)类的所有元素
- sql - 按值数据生成数据 SQL
- ckeditor - 如何在ckeditor前面添加行号?
- authentication - 如何创建新登录的默认头像?
- javascript - :::在javascript中是什么意思