避免在Java 8中else循环时避免多个并行的最佳方法

时间:2018-09-18 09:35:20

标签: java dictionary if-statement java-8

避免多个并行if-else循环的最佳方法是什么。我也尝试了switch语句,但是看起来还是不可读。我有数百条这样的声明:

public static Map getKqvSecureNodeResponse(Sample secureNodeData, Map<String, Object> map) {
    if(map.containsKey(Constants.NAME_KQV)) {
        map.put(Constants.NAME_KQV, secureNodeData.getNodename());
    }
    if(map.containsKey(Constants.SPOV)) {
        map.put(Constants.SPOV, secureNodeData.getOverride());
    }
    if(map.containsKey(Constants.SPEP)) {
        map.put(Constants.SPEP, secureNodeData.getEnabledProtocol());
    }
    if(map.containsKey(Constants.SPTO)) {
        map.put(Constants.SPTO, secureNodeData.getAuthTimeout());
    }
    if(map.containsKey(Constants.TLCN)) {
        map.put(Constants.TLCN, secureNodeData.getCommonName());
    }
    if(map.containsKey(Constants.SEDT)) {
        map.put(Constants.SEDT, secureNodeData.getEncryptData());
    }
    if(map.containsKey(Constants.TLCF)) {
        map.put(Constants.TLCF, secureNodeData.getKeyCertLabel());
    }
    if(map.containsKey(Constants.TLCL)) {
        map.put(Constants.TLCL, secureNodeData.getCipherSuites());
    }
    return map;
}

请注意,每次检查我都必须调用不同的secureNodeData吸气剂。

2 个答案:

答案 0 :(得分:3)

对于每个Constants值(例如Constants.NAME_KQV),您可以提供一个Function<Sample, Object>(例如sample -> sample.getNodename())。

如果您将其组织成Mapenum这样的结构(在这里,我使用了枚举),则可能会遇到一个简单的循环:

public static Map<String, Object> getKqvSecureNodeResponse(Sample secureNodeData, Map<String, Object> map) {
    for (Constant constant : Constant.values()) {
        final String name = constant.getName();
        if (map.containsKey(name)) {
            map.put(name, constant.getFunction().apply(secureNodeData));
        }
    }
    return map;
}

枚举定义为:

enum Constant {
    NAME_KQV(Constants.NAME_KQV, Sample::getNodename);
    // other definitions

    final String name;
    final Function<Sample, Object> function;

    Constant(String name, Function<Sample, Object> function) {
        this.name = name;
        this.function = function;
    }

    public String getName() {
        return name;
    }

    public Function<Sample, Object> getFunction() {
        return function;
    }
}

似乎这种方法做了很多。 (1)不清楚为什么它会覆盖现有值。 (2)方法名称不明确。 (3)您正在使用原始的Map,至少将其替换为Map<String, Object>,并弄清楚如何替换Object部分。 (4)

我认为重新思考设计将比上述方法和这些小修正更有用。

答案 1 :(得分:1)

您可以尝试利用方法引用:

public static Map getKqvSecureNodeResponse(Sample node, Map<String, Object> map) {
    applyParam(Constants.NAME_KQV, map, node::getNodename);
    applyParam(Constants.SPOV, map, node::getOverride);
    // ...
}

public static void applyParam(String key, Map<String, Object> data, Supplier<Object> getter) {
    if (data.containsKey(key)) {
        data.put(key, getter.get());
    }
}

或者,您可以使用与实例无关的Function引用:

private static final Map<String, Function<Sample, Object>> MAPPING;
static {
    MAPPING = new LinkedHashMap<>();
    MAPPING.put(Constants.NAME_KQV, Sample::getNodename);
    MAPPING.put(Constants.SPOV, Sample::getOverride);
}

public static Map getKqvSecureNodeResponse(Sample node, Map<String, Object> map) {
    for (String key : MAPPING.keySet()) {
        if (map.containsKey(key)) {
            map.put(key, MAPPING.get(key).apply(node));
        }
    }
}

有许多方法可以解决您的特定用例,但是一般而言,方法引用使开发人员的工作变得更加轻松。