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

Java 键值映射而不是很长的ELSE-IF构造?,java,string,Java,String,我目前正在研究一种将一些字符串映射到其他字符串的方法 它有很多值,方法开始如下所示: ValueHelper.isEqual()方法正在查找精确匹配 private IValue1 mapValue(IValue2 value2) { if (ValueHelper.isEqual(value2.getName(), StatusValues.ACTIVE)) { return ValueHelper.getName(StatusValues2.WORKING);

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

它有很多值,方法开始如下所示:

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代码块


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

是的,拥有
地图将是正确的方法


您只需查找当前的
StatusValue
作为键,并接收匹配的
StatusValue2

我想一张地图就可以了。您还可以考虑使用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();
 }

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

现在只需对
IValue2
-types变量调用
mapValue
方法。完成。

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

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

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();
    }
}
公共枚举状态{
主动(“主动”,工作),
不活动(“不活动”,不工作),
在役(“在役”,在役),
...
私有最终字符串名;
私人最终价值;
状态(字符串名称、值){
this.name=名称;
这个值=值;
}
公共静态可选getValueForName(字符串名称){
返回Arrays.stream(values())
.filter(v->isEqual(name,this.name))
.findAny();
}
}

使用地图是明智的选择。如果您的过程变得更复杂,请尝试使用接口进行更好的维护。这取决于
ValueHelper.isEqual
的功能…您假设
ValueHelper.isEqual()
查找精确匹配。可能不正确。isEqual()方法查找精确匹配;)然后我会说上面的方法应该可以很好地工作(除非getName()可以返回null,在这种情况下,您需要首先检查这种情况)。您需要执行空检查(如果您期望空值)。另外,返回的是缺少对
ValueHelper.getName()
的调用,该调用可以在
swicth案例的内部/外部执行。总的来说,我认为OP所寻找的是数据映射器模式的Java实现。它们如何比标准HashMap更快、占用更少的内存?