Лучший способ избежать многократного параллельного цикла if в Java 8 - PullRequest
0 голосов
/ 18 сентября 2018

Каков наилучший способ избежать множественного параллельного цикла 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 голосов
/ 18 сентября 2018

Вы можете попробовать воспользоваться ссылками на метод:

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

Существует множество способов приблизиться к вашему конкретному варианту использования, но ссылки на методы в целом значительно упрощают жизнь разработчика.

0 голосов
/ 18 сентября 2018

Для каждого значения 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, замените его как минимум на Map<String, Object> и выясните, как заменить деталь Object.(4)

Я чувствую, что переосмысление дизайна поможет гораздо больше, чем описанный выше подход и эти небольшие исправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...