将用户输入的比较运算符直接带入 if 语句 (java)

Taking a user imputed comparison operator directly into if statement (java)

抱歉,如果这是一个简单的问题,我是编码新手,无法在任何地方找到答案online/couldn找不到正确的措辞方式。

所以我正在为比较运算符(==、!=、<、<=、>、>=)接收用户输入,然后使用它来计算输出。

是否可以将用户输入直接放入 if 语句的比较运算符中?

也就是输入 userInputComparison 并使 if 语句起作用?

if(number1 userInputComparison number2) {

}

还有其他方法吗?

例如,是否可以删除我代码的以下简化版本中的冗余?

BufferedReader reader =  new BufferedReader(new InputStreamReader(System.in));
String userInput = reader.readLine(); //Should be > or <
int userInputNumber = Integer.parseInt(reader.readLine());
System.out.println("RESULTS");
int[] numbers = {5, 15, 12, 7, 0};
if (userInput.equals(">")) {
   for(int i = 0; i < numbers.length; i++) {
      if(numbers[i] > userInputNumber) {
         System.out.println(numbers[i]);
      }
   }
} else if (userInput.equals("<")) {
   for(int i = 0; i < numbers.length; i++) {
      if(numbers[i] < userInputNumber) {
         System.out.println(numbers[i]);
      }
   }
} else {
   System.out.println("please enter > or <");
}

是的,您可以使用 java 中的 ScriptEngineManager。这是一个示例代码,向您展示如何使用它:

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
    Bindings bindings = scriptEngine.createBindings();
    Scanner reader = new Scanner(System.in);

    System.out.println("Please enter operator:");
    String userInput = reader.next();

    System.out.println("Please enter number:");
    int userInputNumber = reader.nextInt();

    int[] numbers = {5, 15, 12, 7, 0};

    String expression = "a" + userInput + "b";
    bindings.put("b", userInputNumber);

    for (int i = 0; i < numbers.length; i++) {
        bindings.put("a", numbers[i]);
        if ((Boolean) scriptEngine.eval(expression, bindings)) {
            System.out.println(numbers[i]);
        }
    }
}

我更喜欢使用 Scanner 而不是 BufferedReader 进行系统控制台交互。 Here 是一些关于您应该在何处使用它们的很好的解释。

直接将用户输入的片段注入您的源代码并拥有它 运行 非常糟糕。这意味着用户现在可以 运行 您计算机上的任何代码,这是一个很大的安全风险。

相反,您应该保留 if 语句,因此只允许 ><>=<=。但是里面的for循环,可以提取出来,所以你的重复代码更少。

您可以通过将运算符存储在 BiPredicate<Integer, Integer>:

中来实现
BiPredicate<Integer, Integer> operator = (x, y) -> false;
if (userInput.equals(">")) {
   operator = (x, y) -> x > y;
} else if (userInput.equals("<")) {
   operator = (x, y) -> x < y;
} else if

...

} else {
   System.out.println("please enter > or <");
}
for(int i = 0; i < numbers.length; i++) {
   if(operator.test(numbers[i], userInputNumber)) {
      System.out.println(numbers[i]);
   }
}