能否在Drools的eval中使用Optional.orElse?编译报错求解决
解决Drools规则eval中Optional.orElse编译错误的方案
提前提取Optional值作为事实插入工作内存
避免在eval表达式中直接处理Optional,先在Java代码中提取值并插入规则引擎的工作内存,规则中直接匹配该事实:
Java代码:// 提前处理Optional,获取默认值 Double calculatedValue = func().orElse(1.0); // 将值插入工作内存 ksession.insert(calculatedValue);Drools规则:
rule "some rule" when // 直接匹配Double类型事实并判断条件 $val : Double(this > 0.0) then // 规则执行逻辑 ... end在规则中绑定Optional变量后再处理
通过from将func()的返回值绑定为Optional变量,避免重复调用函数,再手动判断是否存在值并处理:rule "some rule" when // 绑定func()返回的Optional到变量$opt $opt : Optional() from func() // 分情况判断:存在值则取get()判断,否则用默认值1.0判断 eval($opt.isPresent() ? $opt.get() > 0.0 : 1.0 > 0.0) then // 规则执行逻辑 ... end自定义工具类封装Optional处理逻辑
编写静态工具方法封装orElse的逻辑,在规则中调用该方法,绕过Drools对Optional方法的解析问题:
工具类代码:public class OptionalHelper { public static Double getOrDefault(Optional<Double> optional, Double defaultValue) { return optional.orElse(defaultValue); } }Drools规则:
// 导入自定义工具类 import com.yourpackage.OptionalHelper rule "some rule" when // 调用工具类方法获取值后判断 eval(OptionalHelper.getOrDefault(func(), 1.0) > 0.0) then // 规则执行逻辑 ... end升级Drools版本
如果使用的是较旧的Drools版本(如6.x及更早),可能存在对Java 8 Optional方法的支持缺陷,升级到7.x及以上版本,新版本对Java 8+ API的兼容性更好,可能直接解决orElse方法的编译问题。
内容的提问来源于stack exchange,提问作者katrinawyh
相关产品推荐
相关产品推荐

