【问题标题】:How to eliminate switch case or if-else ? and perform the below operations?如何消除 switch case 或 if-else ?并执行以下操作?
【发布时间】:2019-10-26 16:42:36
【问题描述】:

下面是代码:

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 值保存的是String形式的操作数。有没有办法完全消除 if-else,减少代码的行数。?也不要使用开关盒。

有没有办法在java中将字符串转换为操作数?

【问题讨论】:

  • 您可以使用工厂方法,从"+" 实例化一个类Plus,表示加号运算符等。但它仍然需要有if 条件或switch-case 来决定要实例化哪个类。
  • @jbx 整个想法是避免 switch 或 if-else。
  • 简短回答:否。有关详细信息,请参阅Is it possible to pass arithmetic operators to a method in java?
  • @NeeharikaKompala 是的,我理解你的整个想法。但是以你的思维方式实现它是非常困难的。 Java 不将字符串视为可评估的表达式(与具有 eval() 函数的 Javascript 不同)。

标签: java if-statement switch-statement polymorphism


【解决方案1】:

有一种非常优雅的方式可以通过使用枚举来实现此行为。由于 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);
} 

【讨论】:

    【解决方案2】:

    这个问题之前被问过好几次,据我阅读答案(以及我自己对 java 的经验)所知,没有 java-native 函数(如 expression.eval())可以满足你的要求工作。 造成这种情况的主要原因可能是 java 永远无法知道表达式/值的来源,因此无法提供满足例如输入验证和完整性等。

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

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

    我知道,这不是您希望的答案。将此视为加深您对该语言的理解和知识的机会。

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

    愉快的编码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多