使用存储在列表中的变量计算 Java 中的布尔表达式

Evaluate Boolean Expression in Java with variables stored in a List

我正在寻找一种易于评估的字符串作为包含双精度值和布尔值的布尔表达式。

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

我已经看过 javaluator 但我不确定它是否在一个表达式中支持多种数据类型,例如 double 和 boolean?!

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

我希望有人能帮助我应对这个挑战;-)

您可以使用 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

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

首先循环遍历 key/values 的集合,并将它们构建成一个用分号分隔的字符串。然后附加表达式并调用引擎。

下面的代码只是展示了机制。您仍然需要进行大量错误检查。

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"

    }

}