Слюни 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> {}