我目前正在研究一种将一些字符串映射到其他字符串的方法。
它有很多值,方法看起来像这样:
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代码块。
使这种方法更简单,更短的最佳方法是什么?将值提取到键值映射?或者可能是另一种选择?
答案 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更快,占用更少的内存。