(强制性新手免责声明)
我正在尝试编写一个规则,只要(scala)列表中的对象与条件匹配就会触发该规则。这里的问题是该列表实际上是一个选项(List [TypeA])...(另外,我意识到将列表存储在工作内存中并不是最佳做法,但鉴于这种情况我不能这样做)< / p>
我正在使用的案例类具有以下结构:
TypeA {
arg1 : Option[List[TypeB]]
}
与
TypeB {
value : String
}
我写了一条类似的规则:
when
$a : TypeA($l : arg1)
$b : TypeB() from $l.get()
then
System.out.println($b)
我在没有“.get()”的情况下尝试了这个,只是为了获得Some()类型的对象。
使用“.get()”,我已经设法返回Option的内容但它似乎与预期的类型(List [TypeB])不匹配。相反,返回值的类型似乎是scala.collection.immutable。$ colon $ colon
关于问题是什么的任何想法?如果有任何正确的方法来处理Drools中的选项?
答案 0 :(得分:1)
由于您正在进行大量Java和Scala互操作,因此我建议您自己熟悉Scala的javaconverters功能。这个方便的实用程序集合允许您将Scala集合转换为Java集合,反之亦然。
在您的情况下,我认为您需要从Java集合转换为Scala集合。请尝试以下方法:
import scala.collection.JavaConverters._
val myScalaList = $b.asScala.toList
文件示例:
import scala.collection.JavaConverters._
val sl = new scala.collection.mutable.ListBuffer[Int]
val jl : java.util.List[Int] = sl.asJava
val sl2 : scala.collection.mutable.Buffer[Int] = jl.asScala
assert(sl eq sl2)
您遇到的另一个问题是可变和不可变的数据结构。 Java中的标准列表结构是可变的,但默认情况下,Scala为您提供了一个不可变列表,除非您明确指出您需要一个可变列表。因此,在两个世界之间进行天真转换时会出现一些阻抗不匹配。
正如我在之前的文章中提到的,您可以通过为需要推送到Drools的实体创建Java类来避免许多问题。在基于Scala的项目中将Java类与Scala类混合不是问题。
另一种方法是在Scala案例类中创建一个函数,该函数使用asJava
方法将Scala集合转换为Java集合并返回它。在您需要引用该scala集合的DRL文件中,请调用此方法以便获得Java集合。
理想情况下,JBoss Drools,如果他们选择的话,需要增强他们当前的编译器来更好地处理Scala类型,或者制作一个专用的Drools Scala编译器,它不会破坏Scala类型。
答案 1 :(得分:0)
我唯一想到的就是尝试:
when
$a : TypeA($l : arg)
$b : TypeB() from (ArrayList)$l.get() // or some other Java *-List
then
System.out.println($b)
值得再试一次:
when
$a : TypeA($l : arg)
$b : TypeB() from $l.get()asJava()*-List
then
System.out.println($b)