首页 > 解决方案 > 我如何重构此代码以仅执行一次方法 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);
}

标签: java

解决方案


如果输入映射中的所有键都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);
}

推荐阅读