当前位置: 首页 > 知识库问答 >
问题:

Drools无法将列表绑定到变量

柯景龙
2023-03-14

我有一个返回列表的函数。我试图在drools when子句中调用此函数,并将其绑定到名为l1的变量。如果像这样绑定变量,则子句不会执行。然而,如果我以类似的方式绑定映射,则执行then子句中的语句。我正在使用最新版本的drools。

这是代码

import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

dialect "java"

function Map<Integer, Integer> f1(){
  Map<Integer, Integer> h = new HashMap<>();
  h.put(1,2);
  h.put(2,6);
  return h;
}

function List<Integer> f2(){
  List<Integer> l = new ArrayList<>();
  l.add(1);
  l.add(2);
  return l;
}

rule "test1"
when
    $m1: Map() from f1()
then
    System.out.println("Inside test1");
    System.out.println($m1);
end

rule "test2"
when
    $l1: List() from f2()
then
    System.out.println("Inside test2");
    System.out.println($l1);
end

这里规则'test1'执行并打印值。但是我没有看到规则'test2'的任何输出。

任何帮助都将不胜感激。

共有1个答案

葛和志
2023-03-14

您看到的行为是由于Drools中操作员对Iterables进行的特殊处理引起的。

在Drools中,您可以使用来自运算符的来实际迭代Iterable并将左侧模式应用于它的每个元素。例如,您可以这样做:

function List<String> getNames(){
  List<String> n = new ArrayList<>();
  n.add("John Doe");
  n.add("Peter Seller");
  n.add("John Wick");
  return n;
} 

rule "Filter Johns"
when
    $j: String(this matches "John.*") from getNames()
then
    System.out.println("John found: "+$j);
end

“Filter Johns”规则将执行getNames()函数,并将字符串(这与“John.*)模式匹配)应用于该函数返回的列表中的每个元素。对于这种特殊情况,该规则将被激活两次。

在您的示例中,由于映射不是可编辑的,因此来自的将左模式应用于它,而不进行迭代。在第二条规则中,执行函数fc2(),from检索一个包含2个整数的列表,并将模式应用于每个整数。当然,这不会导致任何激活。

在您的案例中,要清楚地看到这种行为,可以修改您的第二条规则,如下所示:

rule "test2"
when
    $l1: Object() from f2()
then
    System.out.println("Inside test2");
    System.out.println($l1);
end

在本例中,您将看到该规则执行了两次。

 类似资料:
  • 问题内容: 我试图弄清楚如何将AngularJS范围变量绑定到CSS语法中。我认为问题出在花括号中。这是我基本上想做的事情: 关于如何实现这一目标的任何想法?谢谢! 问题答案: 如此处所述, angular不会在样式标签内的内容上运行。在那篇文章中有一个解决方法,但是作为一种更灵活的方法,我只是创建一个指令来获取内容,解析它们并替换: 更新的答案 用法: http://jsfiddle.net/V

  • 当我试图将一个列表元素绑定到JavaFX标签时,我遇到了一个问题。如果项目不在列表中,我没有问题。 垃圾收集器是这个问题的原因吗? Controller.class:(fxml文件的控制器) Context.java:(刷新变量的类) 要刷新标签,我使用

  • 我制作了一个Azure函数(http触发器),并使用Visual Studio 2019将其部署在门户中。 该函数工作正常,我现在将添加一个绑定到我的CosmosDB。我导航到我的函数,然后单击“集成”。现在我看到了触发器、函数以及输入和输出绑定。 我应该可以在这里添加一个新的输入绑定。但我没有“添加”按钮。我做错了什么?

  • 我想在不同的列表中加入多个向量,并输出一个矩阵列表。其思想是,列表中具有相同名称的所有项目,例如所有项目,通过行作为矩阵连接起来。增加的复杂性是,这些向量可以具有不同的长度,因此实现起来并不简单;矩阵中缺少的值可以附加s。 输入列表: 我希望获得的理想输出是一个列表,其中矩阵的数量与唯一列表项的数量相同,其中每个矩阵由行绑定的不同长度的向量组成: 我将如何编写一个函数,它也可以扩展到合并具有不同长

  • 我正在将一个项目升级到Spring Boot 2.2.6。在编译错误之后,将yaml属性数据绑定到对象列表- **请注意,该项目是在我使用的以前版本的spring boot(2.2.1)中编译的** JAVAlang.IllegalStateException:未能加载ApplicationContext,原因是:org。springframework。靴子上下文属性。ConfigurationP

  • 当我试着运行appium时,突然遇到了这个错误。 错误:处理命令时发生未知的服务器端错误。原始错误:执行adbExec时出错。原始错误:“Command”C:\Users\vsingh\AppData\Local\Android\Sdk\platform tools\adb。exe-P 5037-s emulator-5554转发tcp:8200 tcp:6790'已退出,代码为1';斯特德:亚行