将包含逻辑操作的字符串计算为java中的布尔值



我试图将"in1 && in2"评估为布尔值作为测试,但我希望能够评估所有布尔值作为我实际项目的字符串。In1和in2是具有布尔状态的节点的名称,我得到实际的表达式,如

logic = logic.replaceAll(curName, (nodes.get(ins.get(j)).getState() ? "true" : "false"));

logic是与我要求值的逻辑相联系的字符串,curname是当前节点名称,将被其布尔值("in1")例如,它在一个循环中,所以所有的节点名称在字符串被评估之前被替换,nodes是节点的数组列表,ins是节点数组中输入节点的索引,getState()返回节点的布尔值这很好,将逻辑字符串的新值设置为"true &&;true" .

困难的部分是将字符串计算为布尔值。我发现我可以使用javax。脚本帮助我在这里。所以我将它实现为

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
nodes.get(outs.get(i)).setState((boolean)se.eval(logic)); 

问题是每次它的计算结果都是false,当我尝试将eval返回的对象转换为布尔值并尝试像这样显示它时,

System.out.printLine(String.valueOf((boolean)se.eval(logic)));

它只返回false。

在oracle的页面上的eval,我看到有一些其他的参数,可以传递给eval,我错过了其中一个或它是其他的东西完全?

*旁注,这在我没有展示的任何代码中都不是问题,我已经用原始布尔值而不是字符串测试了求值。

无需修改脚本。只需将值作为变量发送。

public static void main(String[] args) throws Exception {
    test(false, false);
    test(false, true );
    test(true , false);
    test(true , true );
}
private static void test(boolean in1, boolean in2) throws ScriptException {
    ScriptEngineManager engineManager = new ScriptEngineManager();
    ScriptEngine engine = engineManager.getEngineByName("JavaScript");
    Bindings vars = engine.getBindings(ScriptContext.ENGINE_SCOPE);
    vars.put("in1", in1);
    vars.put("in2", in2);
    boolean result = (boolean) engine.eval("in1 && in2");
    System.out.println(result);
}
输出

false
false
false
true

您甚至可以预编译脚本以获得更好的性能。

public class Test {
    public static void main(String[] args) throws Exception {
        Test test = new Test();
        System.out.println(test.test(false, false));
        System.out.println(test.test(false, true ));
        System.out.println(test.test(true , false));
        System.out.println(test.test(true , true ));
    }
    private ScriptEngine   jsEngine;
    private CompiledScript script;
    private Test() throws ScriptException {
        this.jsEngine = new ScriptEngineManager().getEngineByName("JavaScript");
        this.script = ((Compilable) this.jsEngine).compile("in1 && in2");
    }
    private boolean test(boolean in1, boolean in2) throws ScriptException {
        Bindings vars = this.jsEngine.createBindings();
        vars.put("in1", in1);
        vars.put("in2", in2);
        return (boolean) this.script.eval(vars);
    }
}

相关内容

  • 没有找到相关文章

最新更新