我已经为像这样的简单条件编写了动态规则。 一个示例对象;
public class Student {
private String name;
private String surName;
private Integer age;
private Address address;
}
我们可以写出任何简单的条件,如下所示
我想实现一个需要迭代对象列表并进行过滤的条件。
一个示例对象;
public class Student {
private String name;
private String surName;
private Integer age;
private Address address;
private List<Subject> subjects;
} 在此处输入代码 我想为主题写一个条件并进行过滤。
当您的规则具有类似
MyObject( ... ) from $list
的条件时,Drools 将迭代列表中的每个对象,并对列表中符合您条件的每个对象执行一次结果。
如果您的班级包含学生列表,例如 --
class School {
List<Student> students
}
你可以这样写你的规则:
rule "Test students over age 10"
when
School( $students: students != null )
$student: Student( name == "test", age > 10, /* other conditions */ ) from $students
then
// this will execute for each student that matches the condition
System.out.println("Found student " + $student.name + " of age " + $student.age);
end
假设
students
包含以下学生(出于示例目的的简化模型):
[
{ name: "test", age: 5 },
{ name: "Alice", age: 5 },
{ name: "Bob", age: 12 },
{ name: "test", age: 100 },
{ name: "Charlie", age: 18 },
{ name: "Darius", age: 8 },
{ name: "Elizabeth", age: 10 },
{ name: "test", age: 11 }
]
那么上面的规则将期望打印:
Found student test of age 100
Found student test of age 11
规则中的这一行:
$student: Student( name == "test", age > 10, /* other conditions */ ) from $students
遍历
$students
列表并考虑每个单独的记录。如果记录与您要查找的条件匹配,右侧(“然后”)将触发,并将 $student
分配给匹配的记录。如果您没有符合您的条件的记录,则该规则将永远不会触发。如果您有一条匹配的记录,它将触发一次。如果您有 100 条匹配记录,则每场比赛都会触发一次。