Оператор MVEL 'in' не работает для коллекций в java

Я пытаюсь использовать оператор MVEL 'in' в своем коде для оценки выражения.

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);

Выдает ошибку: синтаксическая ошибка или несовместимые типы


person user401445    schedule 02.07.2013    source источник
comment
Я предполагаю, что он ожидает, что countryVisited будет типом String, а не типом List‹String›. Вероятно, он проверяет, содержит ли countryAvailable какую-либо из countryVisited, где countryVisited, как ожидается, будет строкой.   -  person Andrew T Finnell    schedule 03.07.2013
comment
@AndrewFinnell Я пытался создать countryVisited как String, но даже это дает ту же ошибку. Любой альтернативный лучший способ проверить 'containsAny' для 2 списков с помощью MVEL?   -  person user401445    schedule 03.07.2013
comment
Я опубликовал ответ, но только что заметил, что вам нужен containsAny вместо containsAll. Вы хотите узнать, есть ли какие-либо страны из списка «Посещенные страны» в списке «Доступные»? Или вы пытаетесь убедиться, что те, которые посетили, доступны?   -  person Andrew T Finnell    schedule 03.07.2013


Ответы (1)


Вот решение. Вам нужно использовать 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

person Andrew T Finnell    schedule 02.07.2013
comment
@ user401445 Хорошо, это имеет смысл. В любом случае ответ, который я разместил, будет работать. Вторая строка вернет true, если какой-либо из посещенных объектов доступен. - person Andrew T Finnell; 03.07.2013
comment
Единственное применение оператора in, которое я могу найти, это проекция. mvel.codehaus.org/Projections+and+Folds Это не то, что вам нужно. - person Andrew T Finnell; 03.07.2013