Слюни mvel для каждого элемента на карте

Одно из исключений в drools включает ручную итерацию по коллекциям в последующем (затем пункт). Мне нужно написать слюну, которая эффективно перебирает карту, делая что-то для каждой пары ключ-значение на этой карте. Другими словами, мне нужно продублировать поведение цикла for-each в drools без фактической записи цикла for-each.

Теперь я понимаю, что мог бы просто написать цикл for-each в последствии. Я хочу, чтобы мой код был как можно ближе к стандарту drools. Я включил более конкретный пример ниже.

У меня есть карта строк и цветов.

Map<String, Color> colorMap

Для каждого цвета на карте я хочу проверить разные коллекции, чтобы найти точный код для этого цвета.

Map<Color, ColorCode> colorCodes

Подход Java-диалекта будет выглядеть примерно так:

for (Map.Entry<String, Color> entry : colorMap.entrySet())
{
    ColorCode code = colorCodes.get(entry.getValue());

    thenconsequence.do(code);
}

Как можно сделать нечто подобное, используя диалект слюни?

Обновление: чем больше я думаю об этой проблеме, тем больше меня беспокоит, что я не должен делать такого рода поиск / повторение карт в контексте слюней. Вместо этого правильным способом является вставка представлений фактических объектов этих коллекций в рабочую память. Например, я мог бы обернуть каждый цвет в colorFact, в который обернут Color и поле, обозначающее название цвета. То же самое с кодами. Тогда я мог бы написать слюни в духе:

when
Color(name=="blue", $c:color)
ColorCode(name == "blue", $code:colorCode)
then 
  $code.printCode();
end

Если это лучший способ, я обеспокоен большим количеством фактов, которые я собираюсь добавить. У меня уже есть тысячи. Это создаст десятки тысяч больше. Я не беспокоюсь о памяти. Скорее, меня беспокоит время, необходимое для перебора всех этих коллекций и добавления их элементов в рабочую память. Кто-нибудь может прокомментировать, если это лучший способ сделать это, или если существует лучший способ?

1 ответ

Хотя это можно сделать с помощью простого набора инструкций Java, вот как это сделать в одном правиле, с наименьшими (я думаю) затратами на вставку и т. Д.:

rule "matchcolorcode"
when
    $cm: ColorMap()
    Map.Entry( $key: key, $color: value ) from $cm.entrySet()
    $ccm: ColorCodeMap( $ccm.containsKey($key) )
then
    System.out.println( $key + ": " + $color + ", " + $ccm.get($key) );
end

Факты являются простыми обертками для общих экземпляров HashMap, например:

class ColorMap extends HashMap<String,Color> {}
Другие вопросы по тегам