使用字符串输入作为布尔值

Using string input as boolean

    String input = sc.nextLine();
    System.out.println(Boolean.parseBoolean(input));

所以我的输入看起来像 1 > 2false || true,但我没有得到正确的值。

但是当我打电话时:

    Boolean x = 1 < 2;
    System.out.println(x);

我猜对了。所以我的问题是。 如何将字符串输入转换为 return 布尔值?

到目前为止尝试过:

    Boolean.parseBoolean();
    Boolean.getBoolean();
    Boolean.valueOf();

感谢您的回答。

编辑

INPUT         -  OUTPUT
1 < 2         -  false(should be true)
false || true -  false(should be true)

您可以为此使用 ScriptEngine

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
String input = "1 > 2";
System.out.println(engine.eval(input)); //prints false

Boolean.parseBoolean(String) 实现为:

public static boolean parseBoolean(String s) {
    return ((s != null) && s.equalsIgnoreCase("true"));
}

所以它 returns true 如果输入字符串不为空且等于 true (忽略大小写)。否则返回 false

您似乎期望 Boolean.parseBoolean(String) 接受表达式字符串并 计算 字符串,但事实并非如此。

当您编写 System.out.println(1<2); 时,它会起作用,因为 println() 有一个重载版本,它采用布尔值。但是当你传递一个字符串时,它只会被认为是字符串,而不是 boolean

另外,Boolean.parseBoolean()总是以字符串形式的布尔值(true\false)作为参数,returns对应的布尔形式的值,否则总是return假

Boolean.parseBoolean 根据 docs 执行以下操作:

public static boolean parseBoolean(String s)

Parses the string argument as a boolean. The boolean returned represents the value true if the string argument is not null and is equal, ignoring case, to the string "true".

您正试图传递一个将 计算 为真或假的表达式,而不是字符串 "true" 或 "True" 或 "TRUE"。因此,这将像这样工作:

Boolean.parseBoolean("true"); // equals true
Boolean.parseBoolean("1 > 2"); // not the string "true", therefore returns false.

一般来说,动态执行包含在字符串中的代码应该非常谨慎。如果字符串是从用户传入的,那将是非常危险的。我的建议是找到更好的方法。

如果您确实需要这样做:

  • 其他答案之一提到使用 ScriptEngine。请注意,这会将字符串计算为 JavaScript,而不是 Java。对于简单的布尔表达式,这可能没问题,但您应该意识到这一点。 Java脚本的真实性规则有时令人困惑,它们不会在 Java 中进行相同的评估。

例如,在 ScriptEngine 中尝试 运行 这个:

1 > '0' // true in JavaScript, but probably unexpected in your code!
  • 如果你想在 Java 中正确地完成这一切,你可以使用 Java Compiler API. Unfortunately, it's not as simple as simply feeding expressions as strings to the ScriptEngine. This post 可能有用,但是,对于 Java 代码的内存编译。