Java中indexOfAny方法的替代方案?用于简易计算器识别运算符
Java简易计算器优化方案
需求说明
开发简易计算器时需要识别+、-、*、/四个运算符,Java没有内置indexOfAny方法,不想重复编写4次indexOf判断运算符位置,同时希望将现有多行switch运算逻辑替换为一行代码实现结果输出。
现有代码问题
现有代码中用input.charAt(1)获取运算符的逻辑只适用于两个个位数运算的场景,若输入多位数(如123+456)会取到错误字符,需要先修正运算符提取逻辑。
优化方案
1. 单条语句提取运算符
无需多次调用indexOf,直接通过正则替换掉所有数字即可得到运算符,适配任意位数的输入:
// 替换readInput方法中char operation = input.charAt(1); 一行 char operation = input.replaceAll("\\d", "").charAt(0);
2. 一行代码输出运算结果
方案A(JDK12及以上版本推荐)
直接使用switch表达式,无需break语句,直接返回运算结果:
// 替换原有全部switch代码块即可 System.out.println(switch (input.getOperation()) { case '+' -> input.getFirstNumber() + input.getSecondNumber(); case '-' -> input.getFirstNumber() - input.getSecondNumber(); case '*' -> input.getFirstNumber() * input.getSecondNumber(); case '/' -> input.getFirstNumber() / input.getSecondNumber(); default -> throw new IllegalArgumentException("不支持的运算符:" + input.getOperation()); });
方案B(低版本JDK兼容)
提前用Map存储运算符对应的运算逻辑,调用时直接取对应逻辑执行即可:
首先在类中定义静态运算映射表:
import java.util.function.IntBinaryOperator; import java.util.Map; public class Main { private static final Map<Character, IntBinaryOperator> OPERATION_MAP = Map.of( '+', Integer::sum, '-', (a, b) -> a - b, '*', (a, b) -> a * b, '/', (a, b) -> a / b ); // 其余原有代码不变
输出时直接一行调用:
System.out.println(OPERATION_MAP.get(input.getOperation()).applyAsInt(input.getFirstNumber(), input.getSecondNumber()));
内容的提问来源于stack exchange,提问作者Ageforce
相关产品推荐
相关产品推荐

