我正在尝试使用这种代码的有效方法。
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;
如果您想查看完整说明,请参阅link
答案 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() {
// ..
}
}