2016-01-06 2 views
0

Я пытаюсь создать правило на Drools. Мой текущий код:Drools Поиск Карта Значения

rule "Test Rule #1" 
when 
obj1 : MyObject () 
map : ArrayList (size < 1) from collect (HashMap (values (House (windows = 3)))) from obj1.getHouses() 
then 
    // Do something 
end 

То, что я пытаюсь сделать: проверить, есть ли дома с 3-мя окнами в HashMap. Если нет // Do something. Для этого я пытаюсь получить доступ к объекту obj1.getHouses(), который является HashMap < String, List < Дома >>. Затем я проверяю значения HashMap и отфильтровываю их для домов, имеющих 3 окна.

Но с этим кодом что-то не так. Я получаю эту ошибку:

Unable to Analyse Expression values (House (windows = 3)): java.lang.Class cannot be cast to org.mvel2.util.MethodStub]

Может кто-нибудь помочь? Спасибо заранее.

+0

Как вы выглядите как HashMap? Этот тип синтаксиса доступен для значений карты [http://stackoverflow.com/a/9095266/3710490](http://stackoverflow.com/a/9095266/3710490) – Valijon

+0

Моя карта: HashMap > , Но я не хочу искать конкретный ключ. Мне нужно выполнить поиск по всем LinkedLists карты. Эта ссылка показывает мне, как искать ключ. –

+0

Можете ли вы опубликовать полный файл drools '.drl'? Кажется, что импорт некоторых классов неверен ... – Valijon

ответ

0
rule "find houses" 
when 
    obj1: MyObject() 
    $fl: List() 
    from accumulate($l: List(), 
     init(List flat = new ArrayList();), 
     action(flat.addAll($l);), 
     result(flat)) 
     from obj1.getHouses().values() 
    not House(windows == 3) from $fl 
then 
    //... $h is a house with three windows 
end 

Вам необходимо разгадать списки, которые являются значениями на вашей карте хэша. Затем вы можете проверить полученный список для домов с тремя окнами.

Поскольку вы не предоставили весь код для создания демонстрации, это правило не проверено.

Смежные вопросы