Drools规则验证Scala Option类型中的对象

时间:2015-02-09 16:52:01

标签: list scala drools scala-option

(强制性新手免责声明)

我正在尝试编写一个规则,只要(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中的选项?

2 个答案:

答案 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)