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

标签 java if-statement optimization duplicates

<分区>

我觉得这是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() 只是一个 View 对象构建器,但我的项目更复杂,其中有许多重复的代码,每个代码中只有不同的变量名 if-else 语句。

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

最佳答案

您可以尝试创建两个 HashMap :

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

关于java - 如何在 if else 语句中简化此类重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50168643/

相关文章:

java - InplaceSelect 适用于对象而不是字符串

java - 尝试替换以/x2D开头的字符串的一部分

java - 使用与时间相对应的 Csv 文件获取奇怪的输出

java - 简单线程串联运行? (第二个线程在第一个线程停止之前不会运行)

Python:如何不在内联 IF 中添加列表理解

python - 如何在 scipy.optimize 函数上强制执行更大的步骤?

Javascript - 仅将 'if-else' 或 'if' 用于单值分配?

linux - 查看服务是否正在使用退出代码运行

r - 当每次迭代都依赖于先前迭代的结果时优化 R 循环

带有嵌套对象优化的 c++ emplace_back