是否可以将算术运算符传递给java中的方法?

2022-09-01 07:24:39

现在,我将不得不编写一个如下所示的方法:

public String Calculate(String operator, double operand1, double operand2)
{

        if (operator.equals("+"))
        {
            return String.valueOf(operand1 + operand2);
        }
        else if (operator.equals("-"))
        {
            return String.valueOf(operand1 - operand2);
        }
        else if (operator.equals("*"))
        {
            return String.valueOf(operand1 * operand2);
        }
        else
        {
            return "error...";
        }
}

如果我能写出更像这样的代码,那就太好了:

public String Calculate(String Operator, Double Operand1, Double Operand2)
{
       return String.valueOf(Operand1 Operator Operand2);
}

因此,运算符将替换算术运算符 (+, -, *, /...)

有谁知道在java中是否可以实现这样的事情?


答案 1

不,你不能在Java中做到这一点。编译器需要知道操作员正在做什么。你可以做的是一个枚举:

public enum Operator
{
    ADDITION("+") {
        @Override public double apply(double x1, double x2) {
            return x1 + x2;
        }
    },
    SUBTRACTION("-") {
        @Override public double apply(double x1, double x2) {
            return x1 - x2;
        }
    };
    // You'd include other operators too...

    private final String text;

    private Operator(String text) {
        this.text = text;
    }

    // Yes, enums *can* have abstract methods. This code compiles...
    public abstract double apply(double x1, double x2);

    @Override public String toString() {
        return text;
    }
}

然后,您可以编写如下方法:

public String calculate(Operator op, double x1, double x2)
{
    return String.valueOf(op.apply(x1, x2));
}

并这样称呼它:

String foo = calculate(Operator.ADDITION, 3.5, 2);
// Or just
String bar = String.valueOf(Operator.ADDITION.apply(3.5, 2));

答案 2

Java 中的方法参数必须是表达式。运算符本身不是表达式。这在Java中是不可能的。

当然,您可以传递表示这些运算符的对象(可能是常量),并相应地执行操作,但不能将运算符本身作为参数传递。enum


其他提示

由于您刚刚开始使用Java,因此最好尽早将这些信息根深蒂固,以方便您未来的发展。

  • 方法名称以小写字母开头:而不是calculateCalculate
  • 变量名称以小写字母开头:而不是operatorOperator
  • Double是引用类型,框为基元类型。double
    • 有效的 Java 第 2 版,第 49 项:首选基元类型而不是盒装基元
  • 不要。相反return "error..."throw new IllegalArgumentException("Invalid operator");

另请参见