传统上,要使用OptaPlanner进行扩展,您必须学习DRL。 不再。 借助受Java 8 Streams和SQL启发的新Constraints Streams API,您现在可以用Java (或Kotlin或Scala) 编写约束,并且仍然可以从增量计算中受益。

在下面,约束流(CS)仍使用强大的Drools引擎。 我们也仍然完全支持得分DRL。 它们被弃用。

让我们从一个例子开始。 在护士排班中,为了避免将班次分配给员工Ann ,您可以在DRL中编写以下约束:

 rule "Don't assign Ann" when Shift(getEmployee().getName() == "Ann" ) then scoreHolder.addSoftConstraintMatch(kcontext, - 1 );  end 

这在使用约束流的Java中是相同的约束:

 Constraint constraint = constraintFactory .from(Shift. class ) .filter(shift -> shift.getEmployee().getName().equals( "Ann" )) .penalize( "Don't assign Ann" , HardSoftScore.ONE_SOFT); 

如果您熟悉SQL或Java 8流,则应该看起来很熟悉。 给定一个有四个班次的潜在解决方案(其中两个分配给Ann ),这些班次将通过约束流流动,如下所示:


这种写约束的新方法有几个好处:

增量计算

首先,与EasyScoreCalculator不同,约束流仍然像DRL一样应用增量分数计算来进行横向扩展。 例如,当一个移动将雇员换两班时,仅计算增量。 这是巨大的可扩展性收益:


索引编制

JOIN多个类型时,就像SQL JOIN运算符一样,约束流在索引上应用哈希查找以更好地扩展:


IDE支持

因为ConstraintsStreams是用Java语言编写的,所以它们背负了非常强大的工具支持。

代码突出显示,代码完成和调试工作正常:

代码突出显示

IntelliJ IDEA Ultimate中的DRL代码:


对于相同的约束,在IntelliJ IDEA Ultimate中使用约束流的Java代码:


代码完成

约束流的代码完成:


当然,所有API方法都具有Javadocs。

调试

在ConstraintStream的filter()添加一个断点:


在调试时诊断问题:


Java语法

用约束流用Java编写的约束,无论好坏,都遵循Java语言规范(JLS)。 当使用来自Kotlin或Scala的约束流时,适用类似的逻辑。

在DRL和约束流之间迁移时,请注意DRL和Java之间的一些区别:

  • DRL的==运算符在Java中转换为equals()
  • 除了getter,DRL还允许MVEL表达式转换为Java中的getter。

例如,此DRL具有name==

 rule "Don't assign Ann" when Employee(name == "Ann" ) then ...  end 

但是,对于完全相同的约束,Java变量具有getName()equals()

 constraintFactory.from(Employee. class ) .filter(employee -> employee.getName().equals( "Ann" )) .penalize( "Don't assign Ann" , ...); 

进阶功能

Constraint Streams API使我们可以添加语法糖和强大的新概念,这些概念专门为帮助您构建复杂的约束而量身定制。

为了突出其中之一,让我们看一下功能强大的groupBy方法:


与SQL GROUP BY运算符或Java 8 Stream Collector相似,它支持sum()count()countDistinct()min()max()toList()甚至自定义函数,同样也不会损失增量分数计算。

约束流的未来工作

首先,非常感谢LukášPetrovický在Constraints Streams上所做的所有工作!

但这仅仅是开始。 我们设想了更高级的功能,例如负载平衡/公平方法,以使此类约束更易于实现。

目前,我们的首要任务是简化对隔离的单元测试的单元。 考虑测试驱动设计。 敬请关注!

翻译自: https://www.javacodegeeks.com/2020/04/constraint-streams-modern-java-constraints-without-the-drools-rule-language.html

约束流–没有Drools规则语言的现代Java约束相关推荐

  1. drools 规则流_约束流–没有Drools规则语言的现代Java约束

    drools 规则流 传统上,要使用OptaPlanner进行扩展,您必须学习DRL. 不再. 借助受Java 8 Streams和SQL启发的新Constraints Streams API,您现在 ...

  2. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  3. drools规则语言指南(五)规则条件和行为

    DRL中的规则条件(WHEN,LHS) 规则结构 规则中的条件 DRL中的when部分就是规则的条件(通常又叫做规则的左手边,即:Left Hand Side(LHS)) 只有满足了所有的条件,才回去 ...

  4. Drools记录之DRL规则语言

    二.DRL(Drools规则语言)规则 DRL文件可以包含单个或多个规则,查询和函数,并且可以定义资源声明,例如由规则和查询分配和使用的导入,全局和属性.DRL软件包必须在DRL文件的顶部列出,并且规 ...

  5. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

  6. 使用 Drools 规则引擎实现业务逻辑,可调试drl文件

    http://www.srcsky.com/tech/arts/389.html 代码下载http://download.csdn.net/detail/zhy011525/2462313 使用 Dr ...

  7. drools规则引擎因为内存泄露导致的内存溢出

    进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...

  8. Drools规则引擎之常用语法

    一.基础api 在 Drools 当中,规则的编译与运行要通过Drools 提供的各种API 来实现,这些API 总体来讲可以分为三类:规则编译.规则收集和规则的执行.完成这些工作的API 主要有Kn ...

  9. 使用 Drools 规则引擎实现业务逻辑

    要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具有复杂的业务逻辑.实现 J2EE 或 J2SE 应用程序中业务逻辑最常见的方法是编写 Java 代码来实现需求文档的规则和逻 ...

最新文章

  1. IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding
  2. java泛型——桥方法
  3. 2015最新Android学习线路图
  4. mysql subquery_mysql-8-subquery
  5. python笔试题目及答案_python笔试题(附带答案)
  6. Padavan固件添加adbyby去广告功能
  7. 微信如何添加企业微信信息服务器地址,企业微信和微信消息怎么互通_企业微信和微信消息互通操作流程一览...
  8. PHP域名whois查询代码(数据源万网、新网)
  9. 汇编语言学习-DOSBox-MASM-安装及使用教程
  10. 阅读笔记:Poison Over Troubled Forwarders: A Cache Poisoning Attack Targeting DNS Forwarding Devices
  11. 伺服阀放大器|通用型电液伺服阀放大器|伺服阀放大器厂家
  12. [k8s]非集群安装过程-笔记
  13. iOS开发 : Navigation Bar的简单设置
  14. element组件树形控件el-tree点击展开节点,节点重影
  15. Element UI 日期范围选择器限制只能选今天之前的时间,或者只能选今天之后的时间
  16. oracle之汉字转拼音
  17. 腾达n4怎么设置虚拟服务器,win10系统电脑设置腾达n4无线路由器的具体教程
  18. 明辰智航云安--报表功能
  19. 为什么刻盘显示计算机内存不够,dvd刻录机在刻录时显示内存不足需终结cd怎么办...
  20. Atmel MCU Advanced Software Framework (ASF) 下载地址

热门文章

  1. 欢乐纪中B组周五模拟赛【2019.3.8】
  2. jzoj4224-食物【多重背包】
  3. nssl1230-序列【位运算】
  4. jzoj1295-设计【差分约束系统,最短路】
  5. SPOJ1812 LCS2
  6. 分布式之redis复习精讲
  7. Oracle入门(五F)之11g show spparameter 命令的使用
  8. Spring Boot的自动化配置原理
  9. 尽力去帮助一个陌生人
  10. java实现遍历树形菜单方法——TreeAction实现