如何在drools规则引擎中实现循环?

问题描述 投票:0回答:1

我已经为像这样的简单条件编写了动态规则。 一个示例对象;

public class Student {
private String name;
private String surName;
private Integer age;
private Address address;

}

我们可以写出任何简单的条件,如下所示

  1. student.name == '测试'
  2. student.address.street == '测试'
  3. 学生年龄>10

我想实现一个需要迭代对象列表并进行过滤的条件。

一个示例对象;

public class Student {
private String name;
private String surName;
private Integer age;
private Address address;
private List<Subject> subjects;

} 在此处输入代码 我想为主题写一个条件并进行过滤。

java drools rule-engine
1个回答
0
投票

当您的规则具有类似

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 条匹配记录,则每场比赛都会触发一次。

© www.soinside.com 2019 - 2024. All rights reserved.