我正在寻找一个易于评估String作为包含double和boolean值的布尔表达式。
(exposeOk && (creditPoints >= 114.5)) || stateAchieved
我已经查看了javaluator,但我不确定,它是否支持多个dataTypes,如double和boolean in one expression?!
最大的挑战是,不存储变量值,例如在名为“exposeOk”的变量中,但在包含字符串值对的对象的列表中。因此,如果求值程序需要exposeOk的值,则必须在List中搜索包含字符串“exposeOk”的对象,并且必须使用存储在该对象中的值。
我希望有人可以帮助我应对这一挑战; - )
答案 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"
}
}