有没有人有任何使用循环的简单 JEXL 示例。我希望遍历一个简单的对象数组列表以输出各种字符串值?
4 回答
输入 452' 的完整示例如下:
public static void testSimpleList() { List<String> list = new ArrayList<String>(); list.add("one"); list.add("two"); JexlContext jexlContext = new MapContext(); jexlContext.set("list", list);; Map<String, Object> functions1 = new HashMap<String, Object>(); functions1.put("system", System.out); JexlEngine jexl = new JexlEngine(); jexl.setFunctions(functions1); Expression expression = jexl.createExpression("for(item : list) { system:println(item) }"); expression.evaluate(jexlContext); }
输出 :
one two
看起来它需要一个使用脚本而不是表达式。
这失败并出现错误“'for'中的解析错误”
e = new org.apache.commons.jexl3.JexlBuilder().create();
c = new org.apache.commons.jexl3.MapContext();
c.set("a", Arrays.asList(1,2,3));
e.createExpression("for(x : a) { b=x }").evaluate(c)
但是,这有效
e.createScript("for(x : a) { b=x }").evaluate(c)
遍历数组、集合、映射、迭代器或枚举的项目,例如
for(item : list) {
x = x + item;
}
其中 item 和 list 是变量。使用 foreach(item in list) 的 JEXL 1.1 语法现已弃用。
http://commons.apache.org/proper/commons-jexl/reference/syntax.html
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
public class Main {
public static void main(String[] args) {
JexlContext jexlContext = new MapContext();
Map<String, Object> functions = new HashMap<String, Object>();
functions.put("system", System.out);
JexlEngine jexl = new JexlEngine();
jexl.setFunctions(functions);
Expression expression = jexl.createExpression("for(item : list) { system:println(item) }");
expression.evaluate(jexlContext);
}
}
pom.xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl</artifactId>
<version>2.1.1</version>
</dependency>
首先,您应该使用Script evaluator,而不是Expression evaluator。表达式求值器不支持复杂的循环语法。参考这里
JexlScript
这些允许您使用多个语句,并且您可以使用变量赋值、循环、计算等。或多或少可以在 Shell 或 JavaScript 中实现其基本级别。最后一个命令的结果从脚本返回。
JxltEngine.Expression
这些是生成“单行”文本的理想选择,例如类固醇上的“toString()”。要进行计算,请使用 ${someVariable} 中类似 EL 的语法。括号之间的表达式的行为类似于 JexlScript,而不是表达式。您可以使用分号来执行多个命令,最后一个命令的结果会从脚本中返回。您还可以使用 #{someScript} 语法使用 2-pass 评估。
试试这个,
JexlScript jexlExpression = jexl.createScript("var x='';for(item:[1,2,3]){ x=x+item;}");
jexlExpression.evaluate(jexlContext);
一旦这对您有用,您也可以使用自己的数组。