Проверка определенного элемента в списке в Drools

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

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

class A {
  String name; 
  String Value;}

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

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

Ответ 1

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

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

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

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
...