Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Drools中,选择子句(使用关键字`from`)可以写在Iterable或迭代器上吗?_Java_Drools_Mvel - Fatal编程技术网

Java 在Drools中,选择子句(使用关键字`from`)可以写在Iterable或迭代器上吗?

Java 在Drools中,选择子句(使用关键字`from`)可以写在Iterable或迭代器上吗?,java,drools,mvel,Java,Drools,Mvel,给定如下Java接口: class Hobby { public String getName() {...} } class Person { public Iterable<Hobby> getHobbies() {...} } when $person: Person() $hobby: Hobby(name == "Knitting") from $person.hobbies 这样行吗?当我们尝试它时,它不会产生任何结果 如果Java代

给定如下Java接口:

class Hobby {
    public String getName() {...}
}

class Person {
    public Iterable<Hobby> getHobbies() {...}
}
when
    $person: Person()
    $hobby: Hobby(name == "Knitting") from $person.hobbies
这样行吗?当我们尝试它时,它不会产生任何结果


如果Java代码返回的是
Iterable
,而不是
集合

在修复不匹配的person/$person后,如果集合中有“kniting”的人,则编译并触发规则。(版本5.5,但我毫不怀疑其他版本也同样适用。)

规则“谁编织”
什么时候
$person:person($name:name)
来自$person.cabiods的爱好(名称==“编织”)
然后
System.out.println(“编织:+$name);
结束
公共阶层人士{
私有字符串名称;
私人列表嗜好=新建ArrayList();
公共字符串getName(){
返回名称;
}  
公众兴趣爱好(){
回归爱好;
}
}
另外,我在您发布的代码片段中没有看到任何Java接口,只有两个类


如果您有问题,请确保提供完整的代码来重现示例。

我修复了问题中的打字错误(缺少
$
)。请注意,这个问题讨论的是非正式意义上的“接口”(某些Java类的公共接口),而不是正式的Java
接口。我写这个问题的时候手头没有Drools环境,因此我为它的非正式性道歉。我将在我的BRMS环境中再试一次,看看您的具体示例是否按预期工作。我提到“接口”只是为了确保我没有遗漏任何内容。等待代码重现问题。-确保添加Drools版本。当Java对象返回的
Iterable
是标准集合时,答案确实有效。出于某种原因,Drools不喜欢使用谷歌番石榴的
Iterables.unmodifiableIterable(Iterable)
rule "who knits"
when
  $person: Person( $name: name )
  Hobby(name == "Knitting") from $person.hobbies
then
  System.out.println( "Knitting: " + $name );
end

public class Person {
  private String name;
  private List<Hobby> hobbies = new ArrayList<Hobby>();
  public String getName(){
    return name;
  }  
  public Iterable<Hobby> getHobbies(){
     return hobbies;
  }
}