java-如何在if else语句中简化此类重复的代码?

这个问题已经在这里有了答案:            >            Converting many ‘if else’ statements to a cleaner approach                                     7个
我认为这是Web项目中非常普遍的情况.假设有一个实体,例如:

//JAVA code
@Data
class Entity{

    private String a;
    private String aExt;

    private String b;
    private String bExt;

    private String c;
    private String cExt;

    ... something more ...
}

出于某种目的,我需要根据传递的参数从Entity中获取部分值,例如:

public ViewObject foo(Entity entity, String condition){

    ViewObject vo = new ViewObject();

    if("aRelated".equals(condition)){
        vo.setValue1(entity.getA());
        vo.setValue2(entity.getAExt());
    }
    else if("bRelated".equals(condition)){
        vo.setValue1(entity.getB());
        vo.setValue2(entity.getBExt());
    }
    else if(cRelated".equals(condition)){
        vo.setValue1(entity.getC());
        vo.setValue2(entity.getCExt());
    }
    ... else statement if there are other values ....

    return vo;
}

我知道我可以使用switch-case语句来减少foo()中的某些单词,但是与if-else相比并没有本质上的区别,尤其是当Entity具有多个变量时.

作为一个简单的示例,foo()只是一个视图对象生成器,但是我的项目更加复杂,在每个if-else语句中都有许多重复的代码,但变量名称不同.

如何减少上面重复的代码?

解决方法:

您可以尝试创建两个哈希图:

// name these properly!
HashMap<String, Function<Entity, String>> valueMap = new HashMap<>();
HashMap<String, Function<Entity, String>> extMap = new HashMap<>();

添加以下KVP:

// valueMap
"aRelated" - Entity::getA
"bRelated" - Entity::getB
"cRelated" - Entity::getC

// extMap
"aRelated" - Entity::getAExt
"bRelated" - Entity::getBExt
"cRelated" - Entity::getCExt

现在,您无需使用if语句即可执行此操作:

vo.setValue1(valueMap.get(condition).apply(entity));
vo.setValue2(extMap.get(condition).apply(entity));
上一篇:python-优化字典的创建


下一篇:C#是否具有零成本抽象?