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

避免Java8中多个并行if-else循环的最佳方法,java,dictionary,if-statement,java-8,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, secureN

避免多重并行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;
}
公共静态映射getkqvsecurenoroderesponse(示例secureNodeData,映射映射){
if(map.containsKey(Constants.NAME_KQV)){
put(Constants.NAME_KQV,secureNodeData.getNodename());
}
if(map.containsKey(Constants.SPOV)){
put(Constants.SPOV,secureNodeData.getOverride());
}
if(map.containsKey(Constants.SPEP)){
put(Constants.SPEP,secureNodeData.getEnabledProtocol());
}
if(map.containsKey(Constants.SPTO)){
put(Constants.SPTO,secureNodeData.getAuthTimeout());
}
if(map.containsKey(Constants.TLCN)){
put(Constants.TLCN,secureNodeData.getCommonName());
}
if(map.containsKey(Constants.SEDT)){
put(Constants.SEDT,secureNodeData.getEncryptData());
}
if(map.containsKey(Constants.TLCF)){
put(Constants.TLCF,secureNodeData.getKeyCertLabel());
}
if(map.containsKey(Constants.TLCL)){
put(Constants.TLCL,secureNodeData.getCipherSuite());
}
返回图;
}

请注意,我必须为每次检查调用不同的secureNodeData getter。

对于每个
常量
值(例如
常量.NAME\u KQV
),您可以提供
函数
(例如
示例->示例.getNodename()

如果将其组织为类似于
Map
enum
(这里,我使用了一个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;
}
公共静态映射getkqvsecurenoroderesponse(示例secureNodeData,映射映射){
for(常量:常量.values()){
最终字符串名称=常量。getName();
if(地图容器(名称)){
put(name,constant.getFunction().apply(secureNodeData));
}
}
返回图;
}
枚举被定义为:

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;
    }
}
enum常量{
NAME_KQV(Constants.NAME_KQV,Sample::getNodename);
//其他定义
最后的字符串名;
最终功能;
常量(字符串名称、函数){
this.name=名称;
这个函数=函数;
}
公共字符串getName(){
返回名称;
}
公共函数getFunction(){
返回函数;
}
}
看来这种方法很管用。(1) 不清楚为什么它会覆盖现有的值。(2) 方法名称不清楚。(3) 您正在使用原始
映射
,至少将其替换为
映射
,并找出如何替换
对象
部分。(四)


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

对于每个
常量
值(例如
Constants.NAME\u KQV
),您可以提供
函数(例如
sample->sample.getNodename()

如果将其组织为类似于
Map
enum
(这里,我使用了一个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;
}
公共静态映射getkqvsecurenoroderesponse(示例secureNodeData,映射映射){
for(常量:常量.values()){
最终字符串名称=常量。getName();
if(地图容器(名称)){
put(name,constant.getFunction().apply(secureNodeData));
}
}
返回图;
}
枚举被定义为:

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;
    }
}
enum常量{
NAME_KQV(Constants.NAME_KQV,Sample::getNodename);
//其他定义
最后的字符串名;
最终功能;
常量(字符串名称、函数){
this.name=名称;
这个函数=函数;
}
公共字符串getName(){
返回名称;
}
公共函数getFunction(){
返回函数;
}
}
看来这种方法很管用。(1) 不清楚为什么它会覆盖现有的值。(2) 方法名称不清楚。(3) 您正在使用原始
映射
,至少将其替换为
映射
,并找出如何替换
对象
部分。(四)


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

您可以尝试利用方法参考:

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


有许多方法可以帮助您处理特定的用例,但是方法引用通常会使开发人员的生活更加轻松。

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

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


有很多方法可以处理您的特定用例,但是方法引用通常会使开发人员的工作更轻松。

但是我必须根据if子句调用different getter
secureNodeData.getNodename()
只会为map.containsKey(Constants.NAME_KQV)调用
。另外,
Map
部分是通用IMO的一种方式。@nullpointer我投票重新打开这个问题,因为这里的特定代码可以使用方法引用(Java 8)重写,而其他问题对于这样的答案来说过于笼统。@antoniosss OP验证条件
Map.containsKey
,所以它应该是
computeIfPresent
(它们宁愿重写该值),但我必须根据if子句调用different getter
secureNodeData.getNodename()
只会为map.containsKey(Constants.NAME_KQV)调用
。另外,部分
Map
是通用IMO的方式。@nullpointer我投票重新打开这个问题,因为这里的特定代码可以用