Java 键值映射而不是很长的ELSE-IF构造?
我目前正在研究一种将一些字符串映射到其他字符串的方法 它有很多值,方法开始如下所示: ValueHelper.isEqual()方法正在查找精确匹配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);
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更快、占用更少的内存?