如何比较和设置 java 和 drools 中的精确集合?

How to compare and set exact collection in java and drools?

我有一个 java class 如下

public  class Ball 
{
  private int size;
  private String brand;
  private ArrayList<String> colour;
  private HashMap<String, String> price;

  //getter and setters

}

我想创建 Drools 规则(java 方言)来读取尺寸、品牌和颜色并相应地设置价格图。

颜色 ArrayList 应该完全匹配,例如如果一个球 有红色、黑色和蓝色 颜色,则应适用特定规则。

价格图,例如[{"US", "1.79"},{"UK", "1.48"},{"UAE", "11.37"}]。不要把它和 json 搞混了,它是一个 java HashMap.

rule "rule 1"
when
ball : Ball
(
 size == 14,
 brand ==  "NIVIA",
 colour ==  //here i want to compare exact match of the arraylist.
)
then
 ball.setPrice(//here i want to set price map);
end

请帮助创建 .drl 文件

首先,我们应该质疑使用List<String>来容纳多种颜色。顺序真的很重要吗?您可能想要区分带有绿色和蓝色圆点的红色球和带有紫色条纹的白色球,但即便如此,单靠 "order" 也无法表达所有细微差别。要点是,当且仅当元素相等时,List.equals(以及 Drools 中的 ==)被定义为 return true, 一个接一个

如果您使用 String[] 并调用 Arrays.equals(),也会出现同样的问题。

我认为最好的解决方案是使用

private Set<String> colour;

并将规则写为

rule "rule 1"
when
    ball: Ball( size == 14, brand ==  "NIVIA",
                colour == new HashSet( Arrays.asList("Red", "Black", "Blue") ) )
then
    ball.setPrice(...);
end

您的 Java 应用程序可能提供 Ball 方法:

public boolean hasColours( String... colours )

这将简化规则中的符号:

  ball: Ball( size == 14, brand ==  "NIVIA",
              ball.hasColours("Red", "Black", "Blue") )