下面是代码:
public String evaluate() {
if (this.data.equals("+")) {
return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) + Double.parseDouble(this.children.get(1).evaluate()));
}
else if (this.data.equals("-")) {
return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) - Double.parseDouble(this.children.get(1).evaluate()));
}
else if (this.data.equals("*")) {
return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) * Double.parseDouble(this.children.get(1).evaluate()));
}
else {
return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) / Double.parseDouble(this.children.get(1).evaluate()));
}
}
this.data值持有字符串形式的操作数。有没有一种方法可以完全消除if-else,减少代码行。也不要使用开关盒。
是否有一种在Java中将字符串转换为操作数的方法?
有一种非常漂亮的方法,可以使用枚举来实现此行为。由于java枚举不仅是枚举(像其他编程语言一样),而且是完整的类,因此您可以编写此枚举(“ +”和“ *”的简单示例):
public enum Operation {
PLUS("+") {
@Override
public int apply(int value1, int value2) {
return value1 + value2;
}
},
MULTIPLY("*") {
@Override
public int apply(int value1, int value2) {
return value1 * value2;
}
};
private final String symbol;
private static final Map<String, Operation> STRING_TO_ENUM = Arrays.stream(Operation.values()).collect(Collectors.toMap(Operation::toString, e -> e));
private Operation(String symbol) {
this.symbol = symbol;
}
public static Operation fromString(String symbol) {
return STRING_TO_ENUM.get(symbol);
}
@Override
public String toString() {
return symbol;
}
public abstract int apply(int value1, int value2);
}
并将评估减少为:
public evaluate() {
return Operation.fromString(this.data).apply(value1, value2);
}
这个问题之前已经问过几次,据我从阅读答案(以及我自己对Java的经验)可以看出,没有Java原生函数(如expression.eval())可以胜任。造成这种情况的主要原因可能是Java永远无法知道表达式/值从何而来,因此无法提供满足以下条件的整体解决方案:输入验证和完整性等。
但是(!),通常聪明的人坐下来为自己的解决方案编写代码。您可能会发现this或that SO Question/Answers有用。答案列出了解决您问题的几种方法。
根据您的用例,您可能不想使事情复杂化。例如,如果您只想评估上面包含的四种操作数/表达式类型,则可以简单地将代码“外包”到其自己的库中,从而使您的主类保持干净,而无需处理第三方代码。
我知道,这不是您想要的答案。借此机会加深您对语言的理解和知识。
显然,cou也可以将您的逻辑转移到支持字符串表达式求值的语言。
快乐编码