Проверить наличие определенного элемента в списке в Drools - PullRequest
10 голосов
/ 24 февраля 2012

Я только начал использовать Drools (версия 5.1.0), поэтому, пожалуйста, потерпите меня, если на этот вопрос уже был дан ответ.

У меня есть объект java.util.List, который содержит объекты сложного типа A, с A как:

class A {
  String name; 
  String Value;}

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

В настоящее время я использую самоопределяемую функцию внутри правила Drools, которая перебирает список и возвращает true, если есть элемент, соответствующий спецификации, однако мне интересно, является ли это наиболее эффективным и простым способом использования.

1 Ответ

16 голосов
/ 24 февраля 2012

Если экземпляры A находятся в рабочей памяти, как вы говорите (идеальный сценарий), просто напишите правило, используя его:

rule X
when
    A( name == "bob", value == 10 )
...

Вставка коллекций (списков, деревьев и т. Д.) Непосредственно в рабочую памятьне рекомендуется, потому что они являются абстрактными структурами данных без какой-либо внутренней семантической привязки.Но допустим, у вас есть класс Person, который содержит список адресов, и вы хотите выполнить правило для каждого адреса в Монреале, Канада, не вставляя сами адреса в качестве facs.Вы можете написать:

rule X
when
    Person( $addresses : addresses )
    Address( city == "Montreal", country == "CA" ) from $addresses
...

Наконец, если вы действительно хотите использовать сам список как факт (опять же, плохая практика), вы можете сделать следующее, но учтите, что он будет соответствовать всем спискам врабочая память:

rule X
when
    $list : List()
    A( name == "bob", value == 10 ) from $list
...
...