约束流–没有Drools规则语言的现代Java约束

传统上,要使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解

遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔。今天,我们就来分享一个由USE DB堵塞故障引发的思考案例。故障描述今天一…

java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

java拦截器项目应用在开发具有某些性能要求的Java EE应用程序时,必须在每个发行版之前验证是否满足这些要求。 您可能会想到,哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量。 您可以检查已实现的时间并将它们与给定的要求进行比较…

iis web.config 配置 经典模式_django部署在iis下,webconfig错误

django部署在iis下,webconfig错误错误原因:iis7以后,web.config管理机制更安全了默认情况下,会锁住配置项,不许修改怎么办?如何求解以上问题呢?D:django_websiteshello>%windir%C:Windows 不…

joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是, 我们并不认为JDK提…

session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例

这是我写的用户登录界面。session_start();include(menu2.php);require(configywcl.php);//加载配置文件require(functions.php);?>请登录系统if ($username){$passwordmd5($password);$sql"select * from user where username$username and password$password";…

mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)

1.简介SpringBoot提供一种固定的、约定优于配置风格的框架,使开发者更快地创建基于spring的应用和程序。可以高效的创建基于Spring的应用服务(SpringBoot不是对spring功能的增强,而是可以更快速使用spring)。为微服务spring cloud铺路,可整合…

css table嵌套内部table不受外部影响_HTML+CSS网页一揽子(4)

CSS重要属性之浮动基本属性:float:left;左浮动float:right;右浮动float:none;不浮动(一般应用于覆盖既有浮动属性时使用)clear:both;清除浮动对其他元素带来的影响应用场景:(1)网站大的结构布局&#xff1a…

mysql ticks_【原创】C# 计时周期数(Ticks)在不同数据库上的实现

动手之前,先来看看 Ticks 在微软官方文档上的定义:注解一个计时周期表示一百纳秒,即一千万分之一秒。1 毫秒内有 10,000 个计时周期,即 1 秒内有 1,000万个计时周期。此属性的值表示自0001年1月1日午夜12:00:00 0:00:00 (公历日期…

在Spring Boot测试中使用Testcontainer进行数据库集成测试

在此博客文章中,我想演示如何在Spring Boot测试中集成Testcontainer以便与数据库一起运行集成测试。 我没有使用Testcontainers的Spring Boot模块。 如何与他们合作,我将在另一篇博客文章中进行介绍。 所有示例都可以在GitHub上找到 。 为什么要使用测试…

java8串行和并行的区别_垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)...

java8串行和并行的区别4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性。 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,尤其是因为…

python函数参数学习_python学习笔记-11.函数参数和返回值进阶

1. 函数参数和返回值的作用函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式:无参数,无返回值无参数,有返回值有参数,无返回值有参数,有返回值定义函数时,是否接收参数…

python邮件发送哪个好_python发邮件(一)

复习模块如果我们要发送邮件,就需要用到smtplib模块的以下方法:1、import smtplib #引入smtplib模块2、server smtplib.SMTP() #server为变量,通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器,SMTP…

python逻辑运算符的使用_总结Python中逻辑运算符的使用

下表列出了所有python语言支持的逻辑运算符。假设变量a持有10和变量b持有20,则:示例:试试下面的例子就明白了所有的python编程语言提供了逻辑运算符:#!/usr/bin/pythona 10b 20c 0if ( a and b ):print "line 1 - a and b are true&q…

如何使用用户数据脚本在EC2实例上安装Apache Web Server

你好朋友, 在本教程中,我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中,我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作,我建议您先进行一下操作。 首先&#xf…

spring 多租户_使用Spring Security的多租户应用程序的无状态会话

spring 多租户从前, 我发表了一篇文章,解释了构建无状态会话的原理 。 巧合的是,我们再次为多租户应用程序执行同一任务。 这次,我们将解决方案集成到Spring Security框架中,而不是自己构建身份验证机制。 本文将解释…

java api 1.6 下载_Java JDK API

JDKJavaDevelopmentKit是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心,包括了Java运行环境。相关软件软件大小版本说明下载地址jdk(Java Development Kit)是Sun Microsystems针对java开…

Java / Cloud:如何快速创建支持Kubernetes的REST微服务

可以肯定地说,如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多,从而导致应用程序部署数量增加。 在过去的十年中,开发了诸如Docker和Kubernetes之类的容器化和编排工具,从而使微服务模式真正易于采用。 本文将教…

使用Spring Boot和Project Reactor处理SQS消息-第2部分

这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距。 1.处理SQS客户端调用中的失败 2.该方法一次只能处理来自SQS的一条消息,如何并行化 3.它不处理错误,管道中的任何错误都会中…

java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎

内容导读在上述代码中,url为输入词条(暂时仅限于英文),进入while循环可一直搜索,当输入为’exit’时退出。contentText为该词条的百度百科简介的网页形式,通过正则表达式将其中的文字提取出来。代码虽然简洁,但是功能还…

matplotlib的默认字体_浅谈matplotlib默认字体设置探索

控制默认字体的设置根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知:The base default font is controlled by a set of rcParams默认字体是由一组rcParams控制的。rcParamusage‘font.family"List of either names of f…