我的表达是这样的:($a+$b)/$c
String expr = "($a+$b)/$c";
Float sum = Float.valueOf("2.2");
HashMap<String, Float> valueMap = new HashMap<String,Float>();
valueMap.put("$".concat(a)), sum);
sum = sum + Float.valueOf("1");
valueMap.put("$".concat(b)), sum );
sum = sum + Float.valueOf("1");
valueMap.put("$".concat(c)), sum );
VariableResolverFactory myVarFactory = new MapVariableResolverFactory();
Serializable compileExpression = MVEL.compileExpression(mtrExprD, valueMap); // here, Only a map of < String,Object > is allowed.
MVEL.executeExpression(compileExpression, myVarFactory); // This should return me a float Value.
MVEL.executeExpression()
返回一个Object;我希望myExpression
返回一个浮点值而不是一个Object。怎么解决这个问题?
答案 0 :(得分:0)
Mvel总是返回对象,我们需要检查instanceOf
是否有Boolean
,Float
等。
此外,在使用算术运算符进行计算时,请使用安全值更安全。
例如,如果
您的exp为a * b
,如果a或b为null
,则Mvel将结果显示为 false 。
答案 1 :(得分:-1)
MVEL#executeExpression return the Object
你必须把它投射在Float
中Float result = (Float) MVEL.executeExpression(compileExpression, myVarFactory);
像这样
Serializable compiled = MVEL.compileExpression("x * y");
Map<String, Integer> vars = new HashMap<>();
vars.put("x", new Integer(5));
vars.put("y", new Integer(10));
// Executes the compiled expression
Integer result = (Integer) MVEL.executeExpression(compiled, vars);
请参阅Mvel doc