我怎样才能只用一种方法制作这个计算器



我正在尝试制作这个计算器我可以用4种方法来做,一种是加法,另一种是减法,还有。。。。。但我想让它尽可能简单。如何使用一个方法执行4个主要操作,然后在staticmain中调用它?

package com.company;
import java.util.Scanner;
public class Main {
final static String first = "first number: ";
final static String sec = "second number: ";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("what do you want to use? (multiply (input *), divide (input /), subtract (input -), addition (input +)");
String input = scanner.nextLine();
double answer = calculation(input);                 ----------------------
System.out.println(answer);
}
public static double calculation(double element){       ----------------------
Scanner scanner = new Scanner(System.in);
System.out.println(first);
double firstInput = scanner.nextDouble();
System.out.println(sec);
double secInput = scanner.nextDouble();
return firstInput element secInput;                 ----------------------
}
}

我能把element改成(+ - * /(吗?(------------------部分是我有问题吗(

您可能想了解OOP原理,使用继承和多态性,您应该能够在一个接口中定义一个方法,并在类中实现它的多个实现,这样您就可以有一个带有执行方法的Calculation接口,然后用一个类似Sum的类来实现该接口,其中执行方法进行真正的求和。

public interface Calculation {
Double execute(Double a, Double b);
}
public class Sum implements Calculation {
@Override
public Double execute(Double a, Double b) {
return a+b;
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("what do you want to use? (multiply => *, divide => /, subtract => -, addition => +");
String input = scanner.nextLine();
Calculation calculation;
if (input.equals("+")) calculation = new Sum();
else calculation = new Sum();// Just initializing calculation to avoid compilation error
double answer = execute(calculation);
}
private static double execute(Calculation calculation){
Scanner scanner = new Scanner(System.in);
double firstInput = scanner.nextDouble();
System.out.println(firstInput);
double secInput = scanner.nextDouble();
System.out.println(secInput);
return calculation.execute(firstInput, secInput);
}
}

您可以使用enumlambda函数来执行它。这种方法允许您轻松地将操作添加到代码中,而无需重写计算方法。首先将Scannertry-with-resources一起使用,或者在不再需要Scanner之后调用scanner.close()。那么最好不要创建两个Scanner对象,而只是将您的输入部分合并在一个方法中(如果您仍然想使用两个Scanner实例,请记住在decorator中包装System.in以防止其关闭(。您还可以添加一些验证来防止输入错误(并让用户再次尝试输入数据(。其主要思想是创建一个枚举,该枚举为每个操作都包含一个BiFunction,用于您的一对数字。它可能看起来像这样:

public class Main {
private final static String first = "first number: ";
private final static String sec = "second number: ";
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
String operationTypes = Arrays.stream(OperationType.values())
.map(type -> String.format("%s (input %s)", type.toString(), type.sign))
.collect(Collectors.joining("(", ", ", ")"));
System.out.println("what do you want to use? " + operationTypes);
String input = scanner.nextLine();
System.out.println(first);
double firstInput = scanner.nextDouble();
System.out.println(sec);
double secInput = scanner.nextDouble();
OperationType operationType = OperationType.fromSign(input).orElseThrow();
double answer = calculation(operationType, firstInput, secInput);
System.out.println(answer);
}
}
public static double calculation(OperationType operationType, double firstInput, double secInput) {
return operationType.operation.apply(firstInput, secInput);
}
enum OperationType {
ADD("+", Double::sum),
SUBTRACT("-", (a, b) -> a - b),
MULTIPLY("*", (a, b) -> a * b),
DIVIDE("/", (a, b) -> a / b);
String sign;
BiFunction<Double, Double, Double> operation;
OperationType(String sign, BiFunction<Double, Double, Double> operation) {
this.sign = sign;
this.operation = operation;
}
public static Optional<OperationType> fromSign(String sign) {
return Arrays.stream(OperationType.values())
.filter(operationType -> operationType.sign.equals(sign))
.findAny();
}
@Override
public String toString() {
return this.name().toLowerCase();
}
}
}

相关内容