我正在使用JEXL http://commons.apache.org/proper/commons-jexl/来评估字符串。
我尝试了以下代码
String jexlExp = "'some text ' + output?'true':'false'";
JexlEngine jexl = new JexlEngine();
Expression e = jexl.createExpression(jexlExp);
JexlContext jc = new MapContext();
jc.set("output", false);
Object x = e.evaluate(jc);
System.out.println(x);
正在将表达式评估为错误的结果。当我尝试连接两个字符串时,它运行良好。当我尝试连接字符串和表达式时,它无法正常工作。
那么,如何在JEXL中连接字符串和表达式?
答案 0 :(得分:2)
在执行三元运算符'some text'
之前,JEXL似乎正在执行output
和?:
的串联。
使用原始表达式'some text ' + output?'true':'false'
,我得到true
的输出。我不完全确定为什么'some text ' + false
会产生true
,但必须在boolean
进行某种隐式转换。
使用'some text ' + output
删除三元运算符,我得到some text false
。
在原始表达式中放置括号以明确表达正在发生的事情,我可以使用表达式true
复制('some text ' + output)?'true':'false'
的输出。
在三元运算符周围放置括号,我可以让三元运算符首先运算,并使用表达式some text false
获得输出'some text ' + (output?'true':'false')
。
这是因为三元运算符?:
的优先级低于JEXL中的+
运算符,与Java的运算符优先级相匹配。在适当的位置添加括号会强制执行?:
运算符。