如何消除开关大小写或if-else?并执行以下操作?

问题描述 投票:0回答:2

下面是代码:

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 if-statement switch-statement polymorphism
2个回答
2
投票

有一种非常漂亮的方法,可以使用枚举来实现此行为。由于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);
} 

1
投票

这个问题之前已经问过几次,据我从阅读答案(以及我自己对Java的经验)可以看出,没有Java原生函数(如expression.eval())可以胜任。造成这种情况的主要原因可能是Java永远无法知道表达式/值从何而来,因此无法提供满足以下条件的整体解决方案:输入验证和完整性等。

但是(!),通常聪明的人坐下来为自己的解决方案编写代码。您可能会发现thisthat SO Question/Answers有用。答案列出了解决您问题的几种方法。

根据您的用例,您可能不想使事情复杂化。例如,如果您只想评估上面包含的四种操作数/表达式类型,则可以简单地将代码“外包”到其自己的库中,从而使您的主类保持干净,而无需处理第三方代码。

我知道,这不是您想要的答案。借此机会加深您对语言的理解和知识。

显然,cou也可以将您的逻辑转移到支持字符串表达式求值的语言。

快乐编码

© www.soinside.com 2019 - 2024. All rights reserved.