在类中表示数学运算符

时间:2018-05-20 23:39:05

标签: java operators anonymous-types

我正在尝试使用这种代码的有效方法。

try {
    switch (op) {
        case "+":
            BinaryOperation addition = (double n1, double n2) -> n1 + n2;
            result = calculator.perform(addition, calculator.pop(), calculator.pop());
            calculator.push(result);
            break;
        case "-":
            BinaryOperation minus = (double n1, double n2) -> n2 - n1;
            result = calculator.perform(minus, calculator.pop(), calculator.pop());
            calculator.push(result);
            break;

我正在尝试创建一个接收任意两个数字的对象(添加或乘以...无论运算符是什么。)

public static final BinaryOperation OP = (double n1, double n2) -> 
        (double) new ScriptEngineManager().getEngineByName("JavaScript").eval(n1 + T + n2);

如何让T代表任何运算符(+, - ,/ ..)。无论是否通过ScriptEngine都没关系。

换句话说,如何让+由一个包含任何类型的运算符

的变量表示
public static final BinaryOperation OP = (double n1, double n2) -> n1 + n2;

教授的指示:enter image description here

如果您想查看完整说明,请参阅link

2 个答案:

答案 0 :(得分:2)

为什么不做这样的事情?

try {
  BinaryOperation operation = (double n1, double n2) ->
    (double) new criptEngineManager().getEngineByName("JavaScript").eval(n1 + op + n2);
  result = calculator.perform(operation, calculator.pop(), calculator.pop());
  calculator.push(result);
}

(我假设您使用了脚本引擎的部分)。

修改

这是一个没有脚本引擎的版本,它只是将所有可用的二进制操作存储在哈希映射中。这可能被视为switch - case

的更简洁的替代方案
import java.util.HashMap;
import java.util.function.DoubleBinaryOperator;

class A02 {

  public static final HashMap<String, DoubleBinaryOperator> 
    SupportedBinaryOperations = 
    new HashMap<String, DoubleBinaryOperator>(){{
      put("+", (x, y) -> x + y);
      put("-", (x, y) -> x - y);
      put("*", (x, y) -> x * y);
      /* etc */
    }};

  public static void main(String[] args) {

     String op = "+";
     double a = 40.0;
     double b = 2.0;
     double result = Double.NaN;

     // excerpt from the stack-processing method that replaces switch-case
     result = SupportedBinaryOperations.get(op).applyAsDouble(a, b);
     // ...handle exception if no operator found etc.

     System.out.println("Result: " + result);
  }
}

我认为,每个二元运算符的定义都相当简洁,绝对比switch - case短。我没有看到它违反的练习文本有什么限制。

PS:我可能应该注意到,在Java中,缩进4个空格更为常见。

答案 1 :(得分:1)

根据教授的指示,您必须告诉RPCalculator如何执行每项操作。您必须为每个实现单独的BinaryOperation实现。但它们不能在单独的源文件中。

正如您已经发现的那样,Lambda是一种很好的方法。并且$_b = $b ?? []; $result_2 = [] + $_b; 是记住在运算符符号和BinaryOperation实现之间进行链接的好方法。

要把这些东西绑在一起,你会看到这样的东西:

Map
public class RPCalculator {
    private Map<String, BinaryOperation> operations = new HashMap<>();

    public void addOperation(String operatorSymbol, BinaryOperation operation) {
        operations.put(operatorSymbol, operation);
    }

    public void perform(String operatorSymbol) {
        BinaryOperation operation = operations.get(operatorSymbol);
        // omitted: Validate input parameters. What to do if operation isn't found? 
        double result = operation.perform(pop(), pop());
        push(result);
    }

    public void push(double value) {
        // ...
    }

    public double pop() {
        // ..
    }
}