Java 将重复的if-else语句修改为更干净的代码
我正在做一个计算器Gui。有没有办法让代码看起来更干净而不重复行Java 将重复的if-else语句修改为更干净的代码,java,if-statement,Java,If Statement,我正在做一个计算器Gui。有没有办法让代码看起来更干净而不重复行 double num1, num2, ans, doub; num1 = Double.parseDouble(FirstInput.getText()); num2 = Double.parseDouble(SecondInput.getText()); oper = (Operator.getText()); if(oper.equals("+")){ ans = num1 + num2; doub = Ma
double num1, num2, ans, doub;
num1 = Double.parseDouble(FirstInput.getText());
num2 = Double.parseDouble(SecondInput.getText());
oper = (Operator.getText());
if(oper.equals("+")){
ans = num1 + num2;
doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
if(oper.equals("-")){
ans = num1 - num2;
doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
if(oper.equals("/")){
ans = num1 / num2;
doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
if(oper.equals("x")){
ans = num1 * num2;
doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
您可以将准备答案的部分提取到单独的方法中,这样就不需要多次编写该代码,例如
private static void prepAnswer(double ans){
double doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
此外,还可以使用switch case语句。看起来是这样的:
String oper = (Operator.getText());
switch(oper) {
case "+": prepAnswer(num1 + num2); break;
case "-": prepAnswer(num1 - num2); break;
case "/": prepAnswer(num1 / num2); break;
case "x": prepAnswer(num1 * num2); break;
default: throw new UnsupportedOperationException();
}
在java-8中,您可以通过引入一种新的方法(接受数字)和一个
DoubleBinaryOperator
,使它变得非常有趣:
public void setAnswerText(double num1, double num2, DoubleBinaryOperator operator){
final double ans = operator.applyAsDouble(num1, num2);
final double doub = Math.round(ans * 100000.0) / 100000.0;
if(doub == (int) ans){
Answer.setText(Integer.toString((int) ans));
} else{
Answer.setText(Double.toString(doub));
}
}
并使用switch语句:
final double num1 = Double.parseDouble(FirstInput.getText());
final double num2 = Double.parseDouble(SecondInput.getText());
final String oper = (Operator.getText());
final DoubleBinaryOperator operator;
switch(oper){
case "+":
operator = (a, b) -> a+b;
break;
case "-":
operator = (a, b) -> a-b;
break;
case "/":
operator = (a, b) -> a/b;
break;
case "x":
operator = (a, b) -> a*b;
break;
default:
throw new UnsupportedOperationException();
}
setAnswerText(num1, num2, operator);
这样,您就可以在switch语句中找到匹配的运算符,然后使用数字和找到的运算符执行该方法
double num1, num2, ans, doub;
num1 = Double.parseDouble(FirstInput.getText());
num2 = Double.parseDouble(SecondInput.getText());
oper = (Operator.getText());
switch(oper){
case "+" : ans = num1 + num2; break;
case "-" : ans = num1 - num2; break;
case "/" : ans = num1 / num2; break;
case "*" : ans = num1 * num2; break;
}
setAnswer(ans);
}
/**
* @param ans
*/
private static void setAnswer(double ans) {
double doub;
doub = Math.round(ans * 100000.0) / 100000.0;
if (doub == (int) ans) {
Answer.setText(Integer.toString((int) ans));
} else {
Answer.setText(Double.toString(doub));
}
}
我喜欢Lino的答案,使用DoubleBinaryOperator(+1)来实现这一点。大多数ifs或开关都可以用多态性代替。没有ifs/开关的功能更易于阅读/测试和维护。从这次谷歌谈话中深受影响 您也可以使用此枚举版本。您需要JDK 8来完成此任务
public enum Operation {
PLUS("+", (x, y) -> x + y),
MINUS("-", (x, y) -> x - y),
MULTIPLY("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final DoubleBinaryOperator op;
private final String symbol;
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
public String toString() {
return symbol;
}
public static void setAnswerText(double num1, double num2, Operation operator) {
final double ans = operator.apply(num1, num2);
final double doub = Math.round(ans * 100000.0) / 100000.0;
if (doub == (int) ans) {
Answer.setText(Integer.toString((int) ans));
} else {
Answer.setText(Double.toString(doub));
}
}
public static void main(String[] args) {
final double num1 = 100;
final double num2 = 200;
final Operation oper = Operation.PLUS;
setAnswerText(num1, num2, oper);
}
}
每个语句中的最后三行(编辑后的六行)是相同的。你可以在if语句中调用它,或者把它放在if语句之外,这样就不会在那里重复你的代码。你可以在这里使用switch case,然后按照@Ben的建议编写一个方法,该方法使用运算符和操作数……还有:一个switch,或者至少一个if-else-if方法会更好。在您的代码中,即使您的第一个if语句返回true,下面的if语句(不必要)仍然会被验证为什么Java-8会提到?这在旧版本中也是可能的。我发现我的代码在一个方法中。将setAnswerText方法放置在距离使用它的位置200行的地方可以吗?@Stultuske,lambda表达式的使用仅适用于Java 8和Javaupwards@Lino阅读您添加到其中的描述,而不查看(所有)文档code@Stultuske经常发生在我身上,只是读一些片段,然后发表一些评论,但后来我不得不收回;)最安全(也是最干净)的方法是将默认案例添加到switch@Stultuske:是的,我添加了一个。您可能希望执行
操作实现双二进制运算符
,因为您已经提供了应用
功能