4

有没有人有任何使用循环的简单 JEXL 示例。我希望遍历一个简单的对象数组列表以输出各种字符串值?

4

4 回答 4

5

输入 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
于 2015-10-12T21:19:54.607 回答
3

看起来它需要一个使用脚本而不是表达式。

这失败并出现错误“'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)
于 2017-01-01T15:24:47.293 回答
2

遍历数组、集合、映射、迭代器或枚举的项目,例如

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>
于 2013-10-15T07:05:29.830 回答
0

首先,您应该使用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);

一旦这对您有用,您也可以使用自己的数组。

于 2018-04-03T04:07:00.203 回答