分享好友 最新动态首页 最新动态分类 切换频道
Java规则引擎easy-rules详细介绍,java排序面试题
2024-12-26 21:02

上面只引入了core模块依赖如需要其它模块内容,再引入对应依赖即可

Java规则引擎easy-rules详细介绍,java排序面试题

定义规则


介绍

大多数业务规则可以用以下定义表示:

  • name:规则命名空间中的唯一规则名称

  • description:规则的简要描述

  • priority:规则的优先级

  • facts:触发规则时的一组已知事实

  • conditions:在给定一些事实的情况下,为了应用该规则,需要满足的一组条件

  • actions:满足条件时要执行的一组操作(可能会添加/删除/修改事实)

Easy Rules为定义业务规则的每个关键点提供了抽象。Easy Rules中的规则由接口表示:

public interface Rule extends Comparable {

boolean evaluate(Facts facts);

void execute(Facts facts) throws Exception;

//Getters and setters for rule name, description and priority omitted.

}

复制代码

方法封装了必须为才能触发规则的条件。方法封装了在满足规则条件时应该执行的操作。条件和操作由和接口表示。

规则可以用两种不同的方式定义:

  • 通过在上添加注解来声明

  • 通过 API编程

这些是定义规则的最常用方法,但是如果需要,您也可以实现接口或扩展类。

使用注解定义规则

Easy Rules提供了注解,可以将POJO转换为规则。

@Rule(name = “my rule”, description = “my rule description”, priority = 1)

public class MyRule {

@Condition

public boolean when(@Fact(“fact”) fact) {

// 规则条件

return true;

}

@Action(order = 1)

public void then(Facts facts) throws Exception {

// 规则为true时的操作1

}

@Action(order = 2)

public void finally() throws Exception {

// 规则为true时的操作2

}

}

复制代码

注解用来标记评估规则条件的方法,这个方法必须是,可以有一个或多个带注解的参数,并返回一个类型。只有一个方法可以用注解标记。

注解用来标记执行操作的方法,规则可以有多个操作。可以使用属性以指定的顺序执行操作。

使用定义规则

允许你用流式API定义规则。

Rule rule = new RuleBuilder()

.name(“myRule”)

.description(“myRuleDescription”)

.priority(3)

.when(condition)

.then(action1)

.then(action2)

.build();

复制代码

在本例中,是接口的实例,和是接口的实例。

组合规则

Easy Rules允许从原始规则创建复杂的规则。一个由一组规则组成。组合规则是一个抽象概念,因为组合规则可以以不同的方式触发。Easy Rules提供了3种的实现。

  • :单元规则组是作为一个单元使用的组合规则,要么应用所有规则,要么不应用任何规则。

  • :激活规则组触发第一个适用规则并忽略组中的其他规则。规则首先按照其在组中的自然顺序(默认情况下优先级)进行排序。

  • :条件规则组将具有最高优先级的规则作为条件,如果具有最高优先级的规则的计算结果为true,那么将触发其余的规则。

组合规则可以从原始规则创建并像常规规则一样注册。

// 从两个原始规则创建组合规则

UnitRuleGroup myUnitRuleGroup =

new UnitRuleGroup(“myUnitRuleGroup”, “unit of myRule1 and myRule2”);

myUnitRuleGroup.addRule(myRule1);

myUnitRuleGroup.addRule(myRule2);

// 像常规规则一样注册组合规则

Rules rules = new Rules();

rules.register(myUnitRuleGroup);

RulesEngine rulesEngine = new DefaultRulesEngine();

rulesEngine.fire(rules, someFacts);

复制代码

规则优先级

Easy Rules中的每个规则都有一个优先级。这表示触发注册规则的默认顺序。默认情况下,值越低优先级越高。要覆盖此行为,您应该重写方法以提供自定义优先级策略。

  • 如果是继承,可以在构造方法中指定优先级,或者重写方法。

  • 如果是使用POJO定义规则,可以通过注解的属性指定优先级,或者使用注解标记一个方法。这个方法必须是,无参却返回类型为。

  • 如果使用定义规则,可以使用方法指定优先级。

Rules API

Easy rules中的一组规则由rules API表示。它的使用方法如下:

Rules rules = new Rules();

rules.register(myRule1);

rules.register(myRule2);

复制代码

表示已注册规则的命名空间,因此,在同一命名空间下,每一个已经注册的规则必须有唯一的名称

是通过方法进行比较的,因此,的实现应该正确的实现方法来确保单一空间下拥有唯一的规则名称。

定义事实


Easy Rules中的一个事实是由表示的:

public class Fact {

private final String name;

private final T value;

}

复制代码

一个事实有一个名称和一个值两者都不能为。另一方面, API 表示一组事实并充当事实的命名空间。这意味着,在一个实例中,事实必须有唯一的名称。

下面是一个如何定义事实的例子:

Fact fact = new Fact(“foo”, “bar”);

Facts facts = new Facts();

facts.add(fact);

复制代码

你也可以使用一个更短的版本,用put方法创建命名的事实,如下所示:

Facts facts = new Facts();

facts.put(“foo”, “bar”);

复制代码

可以使用注解将事实注入到规则的条件和操作方法中。在以下规则中,事实被注入到方法的参数中:

@Rule

class WeatherRule {

@Condition

public boolean itRains(@Fact(“rain”) boolean rain) {

return rain;

}

@Action

public void takeAnUmbrella(Facts facts) {

System.out.println(“It rains, take an umbrella!”);

// can add/remove/modify facts

}

}

复制代码

类型为的参数将被注入所有已知的事实。

注意

  • 如果条件方法中缺少注入的事实,引擎将记录一个警告,并认为条件被计算为。

  • 如果动作方法中缺少注入的事实,则不会执行该动作,并且抛出异常。

定义规则引擎


Easy Rules提供了接口的两种实现:

  • :根据规则的自然顺序(默认为优先级)应用规则。

  • :在已知的事实上不断地应用规则,直到没有更多的规则可用。

创建规则引擎

可以使用构造方法创建规则引擎。

RulesEngine rulesEngine = new DefaultRulesEngine();

// or

RulesEngine rulesEngine = new InferenceRulesEngine();

复制代码

可以按如下方式触发已注册的规则。

rulesEngine.fire(rules, facts);

复制代码

规则引擎参数

Easy Rules引擎可以配置以下参数:

| 参数 | 类型 | 默认值 |

| — | — | — |

| rulePriorityThreshold | int | MaxInt |

| skipOnFirstAppliedRule | boolean | false |

| rulePriorityThreshold | int | false |

| skipOnFirstFailedRule | boolean | false |

| skipOnFirstNonTriggeredRule | boolean | false |

  • :当一个规则成功应用时,跳过余下的规则。

  • :当一个规则失败时,跳过余下的规则。

  • :当一个规则未触发时,跳过余下的规则。

  • :当优先级超过指定的阈值时,跳过余下的规则。

可以使用 API指定这些参数:

RulesEngineParameters parameters = new RulesEngineParameters()

.rulePriorityThreshold(10)

.skipOnFirstAppliedRule(true)

.skipOnFirstFailedRule(true)

.skipOnFirstNonTriggeredRule(true);

RulesEngine rulesEngine = new DefaultRulesEngine(parameters);

复制代码

如果你想从你的引擎中获取参数,你可以使用以下代码段:

RulesEngineParameters parameters = myEngine.getParameters();

复制代码

这允许在创建引擎参数后重新设置引擎参数。

定义规则监听器


可以通过 API来监听规则执行事件:

public interface RuleListener {

default boolean beforeEvaluate(Rule rule, Facts facts) {

return true;

}

default void afterEvaluate(Rule rule, Facts facts, boolean evaluationResult) { }

default void onEvaluationError(Rule rule, Facts facts, Exception exception) { }

default void beforeExecute(Rule rule, Facts facts) { }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

面试建议是一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

中…(img-DtGTo3Qc-1711697371908)]
[外链图片转存中…(img-QjpAHKA7-1711697371908)]
[外链图片转存中…(img-CirdOv3Y-1711697371909)]
[外链图片转存中…(img-VdmcUH8o-1711697371909)]
[外链图片转存中…(img-uCufdZTr-1711697371910)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java
[外链图片转存中…(img-Hfha6pdx-1711697371910)]

面试建议是一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

最新文章
辰光医疗12月13日获融资买入126.37万元,融资余额1539.79万元
12月13日,涨0.14%,成交额6509.95万元。两融数据显示,当日辰光医疗获融资买入额126.37万元,融资偿还0.00元,融资净买入126.37万元。截至12月13日,辰光医疗融资融券余额合计1539.79万元。融资方面,辰光医疗当日融资买入126.37万元。当
青岛啤酒上榜!2024年世界品牌500强揭晓,中国50个品牌入选!
记者从世界品牌实验室公众号获悉,2024年度(第二十一届)《世界品牌500强》排行榜于12月12日在美国纽约揭晓。
碧螺春价格益浩然,茶叶市场再掀波澜
近年来,中国茶叶市场一直处于高速发展的状态。而其中最引人注目的就是碧螺春这一品种。作为中国十大名茶之一,碧螺春以其独特的口感和丰富的营养价值赢得了广大消费者的喜爱。然而,随着时间推移和市场需求变化,碧螺春价格也在不断上涨。
谱尼测试受邀出席第二届医疗器械创新发展大会
  谱尼测试  受邀出席第二届医疗器械创新发展大会  近日,第二届医疗器械创新发展大会在威海隆重举办,()集团受邀参会并设置展台与众多顶尖医疗器械企业、科研机构和专业人才共襄盛举,合作交流,分享前沿技术动态、共同探讨医疗器
用AI生成美女写真:体验超逼真的数字艺术之美!
在这个科技日新月异的时代,越来越多的美好事物通过人工智能(AI)与我们见面。其中,AI生成的美女写真已成为许多人的新宠。有些人可能会好奇,AI究竟是如何将一张简单的照片化为逼真而生动的美女画像?又有哪些工具能助我们一臂之力?今天
怎么扫描图片变成pdf格式?学会这五个方法,转变为清晰的PDF电子版!
怎么扫描图片变成pdf格式?图片和PDF文档已成为我们日常生活和工作中不可或缺的一部分。如果想要将扫描图片转成pdf格式,以便更好地管理和分享? 下面就来给大家分享五种简单的转换方法,快来一起学习下吧! 图片转pdf方法一、金舟PDF转图片
如何利用技术分析工具进行股票交易?这些工具如何帮助投资者做出更明智的决策?
在股票交易的领域中,技术分析工具成为众多投资者手中的利器,帮助他们在复杂多变的市场中探寻方向,做出更明智的决策。布林线(Bollinger Bands)也是备受关注的工具之一。它由三条轨道线组成,中间的是移动平均线,上下两条线则是根据价
竞价推广账户托管服务,按月合作,对效果负责
张红霞100万人民币互联网行业准入咨询服务、互联网线上推广营销服务技术开发、技术转让、技术推广、技术服务、技术咨询;教育咨询;企业管理咨询;销售自行开发后的产品;组织文化艺术交流活动(不含营业性演出);应用软件服务;软件开发
《用Python写网络爬虫第2版》PDF中英文+代码分析
第1章 网络爬虫简介 1 1.1 网络爬虫何时有用 1 1.2 网络爬虫是否合法 2 1.3 背景调研 3 1.3.1 检查robots.txt 3 1.3.2 检查网站地图 4 1.3.3 估算网站大小 5 1.3.4 识别网站所用技术 7 1.3.5 寻找网站所有者 7 1.4 编写第一个网络爬虫 8 1.
百余位香港及内地人士在北京共绘AI大模型创新蓝图
香港驻京办副主任阮慧贤致辞表示,近年来香港特区政府推出多项重点发展人工智能及数据科学产业的措施,包括2022年公布《香港创新科技发展蓝图》,为香港建构人工智能生态圈及完善产业生态链提供清晰的方向;2024年7月成立数字政策办公室,
相关文章
推荐文章
发表评论
0评