花痴流口水颜文字_流口水可执行模型

花痴流口水颜文字

可执行模型是对引擎处理的Drools最低级别模型的重新设计。 在当前的系列(最多6.x)中,可执行模型在过去的8年中有机地增长了,从未真正成为最终用户的目标。 建议那些希望以编程方式编写规则的人通过代码生成和目标drl来完成; 这是不理想的。 从来没有任何驱动程序可以使最终用户更容易地使用它,因为在Java中广泛使用匿名类非常麻烦。 借助Java 8和Lambda的这种变化,就有可能制造出最终用户可以访问的更具吸引力的模型。

这个新模型是在高级语言的编译过程中生成的,但也可以单独使用。 我们的目标是使该可执行模型自成一体,并避免进行进一步的字节码修改(分析,转换或生成); 从该模型的角度来看,所有内容均由代码或高级语言层提供。 例如,索引等必须由参数提供,高级语言在针对可执行模型时会通过分析生成这些参数。

它旨在利用Java 8的lambda很好地映射到Fluent级别的构建者。 这将使其对Java开发人员和语言开发人员更具吸引力。 而且,这将允许独立于任何语言的低级引擎功能设计和测试。 这意味着我们可以在引擎级别进行创新,而不必担心语言层。

可执行模型应该足够通用以映射到多个域。 这将是一个低级数据流模型,您可以在其中处理功能性React式编程模型,但仍可用于从中构建基于规则的系统。

以下示例提供了用于构建可执行模型的流利DSL的第一个视图:

DataSource persons = sourceOf(new Person("Mark", 37),new Person("Edson", 35),new Person("Mario", 40));Variable<Person> markV = bind(typeOf(Person.class));Rule rule = rule("Print age of persons named Mark").view(input(markV, () -> persons),expr(markV, person -> person.getName().equals("Mark"))).then(on(markV).execute(mark -> System.out.println(mark.getAge()))
);

前面的代码定义了一个包含一些人员实例的数据源,并声明了人员类型的变量markV。 规则本身包含通常的两部分:LHS由传递给view()方法的一组输入和表达式定义,而RHS是由传递给then()方法的lambda表达式定义的动作。

更详细地分析LHS,语句如下:

input(markV, () -> persons)

将人员数据源中的对象绑定到markV变量,并通过对象类进行模式匹配。 从这个意义上讲,DataSource可以被视为等同于Drools入口点。

相反的表达:

expr(markV, person -> person.getName().equals("Mark"))

使用谓词定义绑定到markV变量的对象必须满足的条件才能被引擎成功匹配。 请注意,正如预期的那样,模式匹配的评估不是通过作为任何种类的分析或编译过程的结果而生成的约束来执行的,而是仅通过应用实现谓词的lambda表达式(在这种情况下,人员- > person.getName()。equals(“ Mark”))匹配的对象。 换句话说,前一个DSL会产生一个规则的可执行模型,该模型等效于后续drl的解析结果。

rule "Print age of persons named Mark"
whenmarkV : Person( name == "Mark" ) from entry-point "persons"
thenSystem.out.println(markV.getAge());
end

它还正在开发一个rete构建器,可以使用此DSL定义的规则。 特别是,可以将这些规则添加到CanonicalKieBase中,然后像其他任何普通KieBase一样从中创建KieSession。

CanonicalKieBase kieBase = new CanonicalKieBase();
kieBase.addRules(rule);KieSession ksession = kieBase.newKieSession();
ksession.fireAllRules();

当然,DSL还允许定义更复杂的条件,例如连接:

Variable<Person> markV = bind(typeOf(Person.class));
Variable<Person> olderV = bind(typeOf(Person.class));Rule rule = rule("Find persons older than Mark").view(input(markV, () -> persons),input(olderV, () -> persons),expr(markV, mark -> mark.getName().equals("Mark")),expr(olderV, markV, (older, mark) -> older.getAge() > mark.getAge())).then( on(olderV, markV).execute((p1, p2) -> System.out.println(p1.getName() + " is older than " + p2.getName()))
);

或存在模式:

Variable<Person> oldestV = bind(typeOf(Person.class));
Variable<Person> otherV = bind(typeOf(Person.class));Rule rule = rule("Find oldest person").view(input(oldestV, () -> persons),input(otherV, () -> persons),not(otherV, oldestV, (p1, p2) -> p1.getAge() > p2.getAge())).then( on(oldestV).execute(p -> System.out.println("Oldest person is " + p.getName()))
);

这里的not()代表所有表达式的取反,因此上面使用的形式实际上只是以下内容的快捷方式:

not( expr( otherV, oldestV, (p1, p2) -> p1.getAge() > p2.getAge() ) )

还已经以以下形式支持累计:

Variable<Person> person = bind(typeOf(Person.class));
Variable<Integer> resultSum = bind(typeOf(Integer.class));
Variable<Double> resultAvg = bind(typeOf(Double.class));Rule rule = rule("Calculate sum and avg of all persons having a name starting with M").view(input(person, () -> persons),accumulate(expr(person, p -> p.getName().startsWith("M")),sum(Person::getAge).as(resultSum),avg(Person::getAge).as(resultAvg))).then(on(resultSum, resultAvg).execute((sum, avg) -> result.value = "total = " + sum + "; average = " + avg)
);

为了提供最后一个更完整的用例,可以使用此DSL定义经典火灾和警报示例的可执行模型,如下所示。

Variable<Room> room = any(Room.class);
Variable<Fire> fire = any(Fire.class);
Variable<Sprinkler> sprinkler = any(Sprinkler.class);
Variable<Alarm> alarm = any(Alarm.class);Rule r1 = rule("When there is a fire turn on the sprinkler").view(input(fire),input(sprinkler),expr(sprinkler, s -> !s.isOn()),expr(sprinkler, fire, (s, f) -> s.getRoom().equals(f.getRoom()))).then(on(sprinkler).execute(s -> {System.out.println("Turn on the sprinkler for room " + s.getRoom().getName());s.setOn(true);}).update(sprinkler, "on")
);Rule r2 = rule("When the fire is gone turn off the sprinkler").view(input(sprinkler),expr(sprinkler, Sprinkler::isOn),input(fire),not(fire, sprinkler, (f, s) -> f.getRoom().equals(s.getRoom()))).then(on(sprinkler).execute(s -> {System.out.println("Turn off the sprinkler for room " + s.getRoom().getName());s.setOn(false);}).update(sprinkler, "on")
);Rule r3 = rule("Raise the alarm when we have one or more fires").view(input(fire),exists(fire)).then(execute(() -> System.out.println("Raise the alarm")).insert(() -> new Alarm())
);Rule r4 = rule("Lower the alarm when all the fires have gone").view(input(fire),not(fire),input(alarm)).then(execute(() -> System.out.println("Lower the alarm")).delete(alarm)
);Rule r5 = rule("Status output when things are ok").view(input(alarm),not(alarm),input(sprinkler),not(sprinkler, Sprinkler::isOn)).then(execute(() -> System.out.println("Everything is ok"))
);CanonicalKieBase kieBase = new CanonicalKieBase();
kieBase.addRules(r1, r2, r3, r4, r5);KieSession ksession = kieBase.newKieSession();// phase 1
Room room1 = new Room("Room 1");
ksession.insert(room1);
FactHandle fireFact1 = ksession.insert(new Fire(room1));
ksession.fireAllRules();// phase 2
Sprinkler sprinkler1 = new Sprinkler(room1);
ksession.insert(sprinkler1);
ksession.fireAllRules();assertTrue(sprinkler1.isOn());// phase 3
ksession.delete(fireFact1);
ksession.fireAllRules();

在此示例中,可能还要注意几件事:

  • 必须执行一些重复操作才能将表达式的参数绑定到评估它的lambda表达式的形式参数。 希望可以在解决此JDK错误时使用-parameters编译参数来克服此问题。
  • any(Room.class)是bind(typeOf(Room.class))的快捷方式
  • 输入未声明数据源。 这是指出这些对象来自默认空DataSource的快捷方式(对应于Drools默认入口点)。 实际上,在此示例中,事实以编程方式插入到KieSession中。
  • 使用输入而不为其提供任何表达式的输入实际上是input(alarm),expr(alarm,a-> true)的快捷方式
  • 以同样的方式,没有条件的存在模式,例如not(fire)是not(expr(fire,f-> true))的另一个快捷方式
  • Java 8语法还允许将谓词定义为访问诸如expr(sprinkler,Sprinkler :: isOn)之类的事实的布尔属性的方法引用。
  • RHS与要执行的代码块一起,还提供了一个流畅的接口来定义在触发规则时必须执行的工作内存操作(插入/更新/删除)。 特别是,更新还获得了一个字符串变量,用于报告已更新事实中更改的属性的名称,例如update(sprinkler,“ on”)。 由于必须创建可执行模型而无需任何代码分析,因此必须再次明确提供此信息。

翻译自: https://www.javacodegeeks.com/2014/07/drools-executable-model.html

花痴流口水颜文字

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

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

相关文章

clodeblocks debug断点调试_idea debug调试————简单常用,适合初学者

背景&#xff1a;在现在的开发中&#xff0c;如果不会debug&#xff0c;那么将会给我们的开发带来很大的困扰&#xff0c;如果仅仅是依靠日志信息去查问题&#xff0c;将会大大增加我们解决问题的难度&#xff0c;下面说一下idea开发工具下的简单debug。适用人群&#xff1a;ja…

php如何解决脏读,php 技术沉淀

一、cgi/fast-cgi/php-fpm1. cgicgi&#xff0c;通用网关协议&#xff0c;它在职责、通信方式、实现要求和安全性上&#xff0c;对 server 和 cgi 程序进行了规范&#xff0c;使得很多语言能在满足 cgi 协议的前提下&#xff0c;和 server 分工合作&#xff0c;实现 web 开发。…

bigdecimal判断等于0_vue2.0源码用到的工具函数,12个简易的复用函数,看看有多简单...

戎马&#xff1a;https://segmentfault.com/a/11900000196796381. 创建一个被冻结的空对象export const emptyObject Object.freeze({ }) 一旦创建不能给这个对象添加任何属性。2. 判断是否是 undefined 或 nullfunction isUndef (v) { return v undefined || v null}在源码…

告诉我们您想要什么,我们将做到:消费者驱动的合同测试消息传递

相当早以前&#xff0c;我们从REST&#xff08;ful&#xff09; Web API的角度讨论了消费者驱动的合同测试 &#xff0c;尤其是将其投射到Java&#xff08; JAX-RS 2.0规范&#xff09;的角度。 可以公平地说&#xff0c;至少在公共API方面&#xff0c; REST仍在Web API领域占据…

宝塔面板php降级,宝塔面板6.8.8降级到5.9.1的方案教程

有朋友问起&#xff0c;6.8版本用的不习惯&#xff0c;而且缺少5.9版本的nginx过滤器&#xff0c;而且6.8版本许多功能阉割的厉害&#xff1a;服务器状态中的 连接管理、进程管理 也都被阉割&#xff0c;5.9版本是可以在面板中查看服务器进程管理的&#xff0c;如图&#xff1a…

c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

目录&#xff1a;分而治之算法动态规划回溯算法分而治之算法分而治之算法是算法设计的一种方式&#xff0c;它将一个问题分成多个和原问题相似的小问题&#xff0c;递归解决小问题&#xff0c;再将解决方式合并以解决原来的问题&#xff08;例如快速排序&#xff0c;二分搜索等…

背包问题九讲_背包问题

背包问题九讲我发现背包问题既棘手又有趣。 我敢肯定&#xff0c;如果您正在访问此页面&#xff0c;您已经知道了问题说明&#xff0c;但是只是为了完成本章&#xff1a; 问题&#xff1a; 给定一个最大容量为W和N的背包&#xff0c;每个背包都有自己的值和重量&#xff0c;将…

随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

一、什么是随机森林前面我们已经介绍了决策树的基本原理和使用。但是决策树有一个很大的缺陷&#xff1a;因为决策树会非常细致地划分样本&#xff0c;如果决策树分得太多细致&#xff0c;会导致其在训练集上出现过拟合&#xff0c;而如果决策树粗略地划分样本&#xff0c;又不…

Java Code Geeks通过Twitter赠送了免费的Sublime Text Editor许可

正在与您的重量级编辑斗争&#xff1f; 然后&#xff0c;我们特别为您准备了一些东西&#xff01; 我们正在举办比赛&#xff0c;免费赠送 kick-ass Sublime Text Editor 许可证 。 Sublime Text是用于代码&#xff0c;标记和散文的高级文本编辑器。 您会喜欢光滑的用户界面…

http端口_PhpStorm 修改默认端口号63342

PhpStorm 修改默认端口号63342​blog.csdn.net关键词PhpStorm phpStorm phpstorm 修改默认端口号63342 8080 80步骤1.打开Settings2. Build, Execution, Deployment→Deployment3.点击添加&#xff0c;选择In place起一个名字&#xff08;可以随便起&#xff09;在Web server U…

php根本自学不了,PHP开发自学还是培训?

员有两种&#xff0c;一种是会php的&#xff0c;一种是不会php的&#xff0c;今天我们不去说哪种开发语言好&#xff0c;哪种又不好&#xff0c;因为语言只是一种工具而已不管你是从IOS、.NET或其它语言进入这个行业&#xff0c;只要你在这个行业坚持多年&#xff0c;与php的感…

rds mysql 磁盘空间,RDS MySQL 空间问题的原因和解决

other_size- 系统文件和临时文件使用空间data_size- 数据文件使用空间binlog_size- Binlog 文件占用空间注&#xff1a;获取实例诊断报告的步骤请参考如何访问RDS 实例诊断报告。2. 解决RDS 实例支持单独升级磁盘空间&#xff0c;升级磁盘空间是解决空间问题的有效方式之一。下…

微信小程序 全局变量异步函数_微信小程序【生命周期】

小程序分为应用、页面和组件三个部分&#xff0c;所以小程序的生命周期涉及以下应用的生命周期页面的生命周期组件的声明周期应用的生命周期对页面生命周期的影响应用的生命周期App() 函数用来注册一个小程序。接受一个 Object 参数&#xff0c;其指定小程序的生命周期回调等。…

oracle agile 性能,Oracle Agile PLM安全漏洞(CVE-2016-3554)

Oracle Agile PLM安全漏洞(CVE-2016-3554)发布日期&#xff1a;2016-07-21更新日期&#xff1a;2016-07-25受影响系统&#xff1a;Oracle Supply Chain Products Suite 9.3.5Oracle Supply Chain Products Suite 9.3.4描述&#xff1a;CVE(CAN) ID: CVE-2016-3554Oracle Agile产…

java 挥发注解_Java的挥发性修饰符

java 挥发注解不久前&#xff0c;我写了一个Java servlet过滤器&#xff0c;该过滤器在其init函数中加载配置&#xff08;基于web.xml的参数&#xff09;。 筛选器的配置缓存在私有字段中。 我在字段上设置了volatile修饰符。 后来&#xff0c;当我检查Sonar公司以查看是否在代…

python 线程锁_python多线程编程(3): 使用互斥锁同步线程

问题的提出 上一节的例子中&#xff0c;每个线程互相独立&#xff0c;相互之间没有任何关系。现在假设这样一个例子&#xff1a;有一个全局的计数num&#xff0c;每个线程获取这个全局的计数&#xff0c;根据num进行一些处理&#xff0c;然后将num加1。很容易写出这样的代码&am…

Comnnect oracle,RAC监听日志与CRS日志

RAC监听日志&#xff1a;tnsname.oraCRS日志&#xff1a;位置&#xff1a;Oracle集群涉及的日志主要位于“$ORA_CRS_HOME/log”和“$ORACLE_HOME/log”目录中目录结构&#xff1a;tree -d $ORA_CRS_HOME/logtree -d $ORACLE_HOME/log禁止Clusterware在系统重启后自动启动&#…

python全栈开发百度云_价值2400 2016年11月全栈开发Flask Python Web 网站编程

01-计算机基础常识.mp4 02-Python语言概览、安装与运行.mp4 03-Python 变量、数据类型及存储.mp4 04-Python 常用数据类型概览.mp4 05-数值与字符串.mp4 06-列表list.mp4 07-字典表dict 与元组 tuple.mp4 08-文件与类型汇总.mp4 09-语句、表达式与if分支.mp4 10-循环语句.mp4 1…

Java / Spring:如何快速生成整个数据库CRUD REST API

随着时间的流逝&#xff0c;Spring框架已成为Java中使用最广泛的Web开发框架之一&#xff0c;这一点已变得显而易见。 在接下来的十年之际&#xff0c;Spring最受欢迎的模块Spring Boot刚刚进行了重大更新。 新的Spring Boot版本“ 2.2.0”和年份“ 2020”几乎完美匹配。 因此…

如何在虚拟linux环境运行python_Conda(Python)虚拟环境不能从Windows移植到Linux

在我的Windows 10计算机上&#xff0c;我使用以下命令创建了一个虚拟环境&#xff1a;>conda env export > environment.yml 我尝试在Windows系统上使用yml文件重新创建虚拟环境&#xff0c;效果很好。然后我转学了环境.yml在我的Linux机器&#xff08;Ubuntu16.04.1&…