Java 在Drools中,选择子句(使用关键字`from`)可以写在Iterable或迭代器上吗?
给定如下Java接口: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代
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;
}
}