代码之家  ›  专栏  ›  技术社区  ›  Abhishek

避免java 8中多个并行if-else循环的最佳方法

  •  1
  • Abhishek  · 技术社区  · 6 年前

    避免多个并行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的不同getter。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Andrew    6 年前

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

    如果你把它组织成 Map enum (这里,我使用了一个枚举),您可以得到一个简单的循环:

    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<String, Object> Object 部分。(四)

    我觉得重新考虑这个设计会比上面的方法和这些小的修正更有帮助。

        2
  •  1
  •   Pavel Horal    6 年前

    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));
            }
        }
    }