键值映射而不是很长的ELSE-IF构造?

时间:2016-09-09 10:12:58

标签: java string

我目前正在研究一种将一些字符串映射到其他字符串的方法。

它有很多值,方法看起来像这样:

ValueHelper.isEqual()方法正在寻找完全匹配。

private IValue1 mapValue(IValue2 value2) {
    if (ValueHelper.isEqual(value2.getName(), StatusValues.ACTIVE)) {
            return ValueHelper.getName(StatusValues2.WORKING);
    } else if (ValueHelper.isEqual(value2.getName(), StatusValues.INACTIVE)) {
            return ValueHelper.getName(StatusValues2.NOT_WORKING);
    } else if (ValueHelper.isEqual(value2.getName(), StatusValues.IN_SERVICE)) {
            return ValueHelper.getName(StatusValues2.SERVICE);
    }
}

目前,我有10个else-if代码块。

使这种方法更简单,更短的最佳方法是什么?将值提取到键值映射?或者可能是另一种选择?

5 个答案:

答案 0 :(得分:2)

我猜测地图会很好。您也可以考虑使用switch-case来减少冗长:

private IValue1 mapValue(IValue2 value2) {
 switch(value2.getName()) {
     case StatusValues.ACTIVE:     return StatusValues2.WORKING;
     case StatusValues.INACTIVE:   return StatusValues2.NOT_WORKING;
     case StatusValues.IN_SERVICE: return StatusValues2.SERVICE;
     default: throw new RuntimeException();
 }

答案 1 :(得分:2)

OOP方法是在界面IValue2中使用此方法:

interface IValue2 {
    ...
    String getName();
    IValue1 mapValue();
}

现在每个实现对象都必须覆盖此抽象方法。这可能需要一些实现更改。例如,您可以拥有ActiveValue2类:

class ActiveValue2 implements IValue2 {
    ...
    public String getName() {
        return StatusValues.ACTIVE;
    }
    public IValue1 mapValue() {
        return ValueHelper.getName(StatusValues2.WORKING);
    }
}

您现在只需在mapValue - 类型变量上调用IValue2方法。完成。

答案 2 :(得分:0)

是的,拥有<StatusValues, StatusValues2>地图将是正确的方法。

您只需查找当前的StatusValue作为密钥,即可获得匹配的StatusValue2

答案 3 :(得分:0)

您可以考虑将字符串转换为枚举:

public enum Status {
    ACTIVE("active", WORKING),
    INACTIVE("inactive", NOT_WORKING),
    IN_SERVICE("inservice", SERVICE),
    ...

    private final String name;
    private final Value value;

    Status(String name, Value value) {
        this.name = name;
        this.value = value;
    }

    public static Optional<Value> getValueForName(String name) {
        return Arrays.stream(values())
            .filter(v -> isEqual(name, this.name))
            .findAny();
    }
}

答案 4 :(得分:-1)

使用番石榴不可变地图。它们比标准的Java HashMap更快,占用更少的内存。