EvalEx示例
项目做久了,难免会发现有些需求总是反复无常,今天想这样,明天想那样,但是逻辑本身又不是很复杂,比如:
A、很多系统为了鼓励用户,会出一些奖励政策:连续打卡(或登录)X天,奖虚拟币Y枚。但是这个X,Y的系数,可能会经常调整,有时候甚至还会搞1个上限封顶。
B、系统出现重大故障后,事后复盘,要定故障等级,一般会涉及几个变量:“故障持续时间”、“影响订单数”、“影响用户数”...,然后根据这些变量,套一个公式,算出来一个值。但是这个计算公式,可能时常调整。
...
这类场景,有一个共同的特征:已知若干变量A,B,C...,通过一些数学运算,计算出一个值。只是这些数学运算规则 ,可能会随着业务时常调整。如果硬编码的话,就得经常改代码,十分枯燥。
这时候,就是EvalEx这个开源项目的用武之地了,简言之,EvalEx可以动态处理一些数学表达式(即:业务上的计算规则)进行计算,这样我们只要把这些规则弄成配置,当需求变化时,调整表达式的配置即可。
用法:
1、先引用pom依赖项
<dependency>
<groupId>com.udojava</groupId>
<artifactId>EvalEx</artifactId>
<version>2.5</version>
</dependency>
2、示例
import com.udojava.evalex.Expression;
import java.math.BigDecimal;
public class EvalexTest {
public static void main(String[] args) {
//业务规则:连续登录5天,奖励2个虚拟币
String rule = "FLOOR(loginDays/5)*2";
BigDecimal result = new Expression(rule)
//用户实际连续登录的天数,这里只是示例,实际应用中,可从db中查询出具体值
.with("loginDays", "6")
.eval();
System.out.println(result.toPlainString());
}
}
输出:2
参考文档:
https://github.com/uklimaschewski/EvalEx
EvalEx示例的更多相关文章
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- XAMARIN ANDROID 二维码扫描示例
现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile 做一个简单的 Android 条码扫描示 ...
- iOS之ProtocolBuffer搭建和示例demo
这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...
- Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)
示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...
- oracle常用函数及示例
学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
随机推荐
- Git Reset 彻底解析:--hard 模式操作步骤、风险与完整恢复指北
结论先行 使用 git reset --hard <commit_id> 可强制将本地代码.暂存区.工作目录彻底回退到指定提交状态,但会丢弃目标提交之后的所有提交记录(需谨慎操作,尤其涉及 ...
- 典型相关分析 CCA
最近有小伙伴在问我一个数据分析的问题, 做毕设, 实证分析. 不知道改如何处理数据. 看了下设计的量表大致是这样的, 都是 5级的里克特量表, 大致分为两波, X, Y. 小伙伴认为就只有两个变量, ...
- 那些神奇的CSS特性,你都有用过么?
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- JavaScript 从零实现物理模拟
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Scroll滚动,你玩明白了嘛?
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 编译原理:python编译器--从AST到字节码
首先了解下从AST到生成字节码的整个过程: 编译过程 Python编译器把词法分析和语法分析叫做 "解析(Parse)", 并且放在Parser目录下. 从AST到生成 字节码的过 ...
- 使用TVMC进行模型的编译与优化
TVMC介绍 TVMC,是TVM的命令行驱动程序,TVMC是一种通过命令行界面公开TVM功能的工具,例如uto-tuning/compiling/profiling和通过命令行接口运行模型 在完成本节 ...
- SpringBoot3整合SpringSecurity6(五)自定义登陆页面
大家好,我是晓凡 写在前面 在前面的文章中,我们学习了SpringSecurity 登录认证流程,对其应该有个大概印象了. 忘记的小伙伴点击下面自己复习去~ 在前面的学习中,我们使用的都是Spring ...
- React-native之Flexbox
本文总结: 我们学到了 React Native 的 Flexbox 布局,它让写样式变得更方便啦! Flexbox 就像一个有弹性的盒子,有主轴和交叉轴(行或列). 在 RN 里写样式要用 Styl ...
- 「Log」2023.8.24 小记
序幕 \(\texttt{7:20}\):才到校,昨天调题整半夜去了,没想到这么晚来的人也少. 按惯例整理博客. 补题,补串串. \(\color{blueviolet}{P2444\ [POI200 ...