MVEL'in'运算符不适用于java中的集合

时间:2013-07-02 20:37:39

标签: java mvel

我正在尝试在我的代码中使用'运算符'中的MVEL来评估表达式

List<String> countriesAvailable = new ArrayList<String>();
countriesAvailable.add("Australia");
countriesAvailable.add("France");
List<String> countriesVisited = new ArrayList<String>();
countriesVisited.add("Austria");
countriesVisited.add("France");
Map<String, List<String>> vars = new HashMap<String, List<String>>();
vars.put("countriesAvailable", countriesAvailable);
vars.put("countriesVisited", countriesVisited);
Boolean s = (Boolean) MVEL.eval("countriesVisited in countriesAvailable", vars);
System.out.println(s);

给出错误:语法错误或不兼容的类型

1 个答案:

答案 0 :(得分:2)

这是解决方案。您需要使用containsAll

另请注意,您在第二个列表中拼错了澳大利亚。我不确定这是否是故意检查评估。

    List<String> countriesAvailable = new ArrayList<String>();
    countriesAvailable.add("Australia");
    countriesAvailable.add("France");

    List<String> countriesVisited = new ArrayList<String>();
    countriesVisited.add("Austria");
    countriesVisited.add("France");

    Map<String, List<String>> vars = new HashMap<String, List<String>>();
    vars.put("countriesAvailable", countriesAvailable);
    vars.put("countriesVisited", countriesVisited);

    Boolean s = (Boolean) MVEL.eval(
            "countriesAvailable.containsAll(countriesVisited)", vars);

    System.out.println("Result = " + s);

Result = false

您还可以使用java.util.Collections执行不相交的操作。并采取消极的态度。

Boolean s = 
   (Boolean) MVEL.eval(
         "!java.util.Collections.disjoint(countriesAvailable,countriesVisited)",
         vars);

Result = true