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

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

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); } 

所以运算符会replace算术运算符(+, – ,*,/ …)

有没有人知道如果这样的东西是可能的在Java?

不,你不能用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)); 

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

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


其他提示

由于您刚开始使用Java,因此最好尽早使用这些信息来减轻您的未来发展。

  • 方法名称以小写字母开头: calculate而不是Calculate
  • variables名称以小写: operator而不是Operator开头
  • Double是引用types,原始types为double的框。
    • 有效的Java第2版,项目49:优先原始types,以盒装原语
  • 不要return "error..." 。 相反, throw new IllegalArgumentException("Invalid operator");

也可以看看

  • Java语言指南/自动装箱
  • Java课程/例外
  • 编码约定/命名
    • 这个文件中的不幸的错字: 这个声明是如何有意义的? (Sun的Javavariables命名约定)

你不能直接传递操作符。 你可以使用函子 。

 public double Calculate(BinaryFunction<Double, Double, Double> op, double Operand1, double Operand2) { return (double)op.evaluate(Operand1, Operand2); } 

只有使用callback接口的麻烦的方式。 就像是

 interface Operator { public Double do(Double x, Double y); } 

然后你实现你需要的操作符:

 Operator plus = new Operator() { public Double do(Double x, Double y) { return x + y; } }; 

而你的generics方法需要一个运算符和两个参数:

 public String Calculate(Operator operator, Double x, Double y) { return String.valueOf( operator.do(x, y) ); } 

如果你只需要一个较小的固定数量的操作符,你也可以使用一个枚举而不是一个接口。

你也可以

  1. 使用JVM的函数式语言来实现代码的这一部分(clojure,scala et el),在math运算符周围包装lambda函数并将这些函数作为parameter passing

  2. 获取像http://www.singularsys.com/jep/这样的Javaexpression式评估器(并且必须有许多免费的替代scheme);

不,这样做是不可能的。

你将需要一个parsing器来做你想做的事情,这可能很麻烦。

你可能会问错误的问题,因为你得到了错误的答案。

如果你正在寻找一个mathparsing器,你可能想看看SF上的这个项目: http : //sourceforge.net/projects/jep/

这可能有一些答案。

这将是很好,不是吗? 但是,你不能这样做。 你也许可以通过编写自己的“运营商”来完成类似的事情。

 public interface Operator { Double calculate(Double op1, Double op2); } public Addition implements Operator { @Override Double calculate(Double op1, Double op2) { return op1 + op2; } } public class Calculator { private static Operator ADDITION = new Addition(); private static Map<String,Operator> OPERATORS = new HashMap<String,Operator>(); static { OPERATORS.put("+",ADDITION); } public String Calculate(String operator, Double operand1, Double operand2) { return String.valueOf(OPERATORS.get(operator).calculate(operand1,operand2); } } 

你得到的图片如何延伸到许多其他运营商…不仅显着加倍。 我的方法的优点是你可以保持你的方法签名接受一个String运算符。

运算符AFAIK不能作为任何语言的parameter passing(至less我遇到过)。

原因是只有值(通过复制或引用)可以作为“参数值”传递。

操作员没有价值。