使用存储在List中的变量评估Java中的布尔表达式

时间:2015-08-02 12:51:39

标签: java boolean double expression evaluation

我正在寻找一个易于评估String作为包含double和boolean值的布尔表达式。

(exposeOk && (creditPoints >= 114.5)) || stateAchieved

我已经查看了javaluator,但我不确定,它是否支持多个dataTypes,如double和boolean in one expression?!

最大的挑战是,不存储变量值,例如在名为“exposeOk”的变量中,但在包含字符串值对的对象的列表中。因此,如果求值程序需要exposeOk的值,则必须在List中搜索包含字符串“exposeOk”的对象,并且必须使用存储在该对象中的值。

我希望有人可以帮助我应对这一挑战; - )

2 个答案:

答案 0 :(得分:3)

您可以使用EL 3.0,现在可以在独立模式下使用

    import java.util.HashMap;
    import java.util.Map;
    import javax.el.ELProcessor;

    public class ExpressionLanguageExample {

        public static void main(String[] args)
        {
            Map<String, Object> variables = new HashMap<>();
            variables.put("exposeOk", true);
            variables.put("creditPoints", 220.2);
            variables.put("stateAchieved", true);

            ELProcessor elProcessor = new ELProcessor();
            for (Map.Entry<String, Object> entrySet : variables.entrySet()) {
                String key = entrySet.getKey();
                Object value = entrySet.getValue();
                elProcessor.setValue(key, value);
            }
            Object eval = elProcessor.eval("(exposeOk && (creditPoints >= 114.5)) || stateAchieved");
            System.out.println(eval);
        }
    }

一些链接:

http://www.slideshare.net/reza_rahman/whats-new-with-expression-language-in-java-ee-7 http://www.adam-bien.com/roller/abien/entry/the_hidden_javaee_7_gem

答案 1 :(得分:1)

解决方案取决于表达式的格式。 Java和javascript表达式类似。如果该语法有效,那么您可以使用内置的javascript引擎来处理表达式。

首先循环遍历您的键/值集合,并将它们构建为以分号分隔的字符串。然后附加表达式并调用引擎。

下面的代码只显示了这些机制。你还有很多错误检查要做。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Expr {

    public static void main(String [] args) throws ScriptException {

        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");

        // Get your variables into javascript code
        String vars = "exposeOk=true;creditPoints=120.5;stateAchieved=false";

        // The expression
        String expr = "(exposeOk && (creditPoints >= 114.5)) || stateAchieved";

        String t = engine.eval(vars+";"+expr).toString();

        System.out.println(t); // Prints "true"

    }

}