项目做久了,难免会发现有些需求总是反复无常,今天想这样,明天想那样,但是逻辑本身又不是很复杂,比如:

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示例的更多相关文章

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  2. .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1

    微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...

  3. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  4. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  5. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  6. XAMARIN ANDROID 二维码扫描示例

    现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile  做一个简单的 Android 条码扫描示 ...

  7. iOS之ProtocolBuffer搭建和示例demo

    这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...

  8. Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...

  9. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  10. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

随机推荐

  1. 【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例

      CSRF-Token 机制是 Web 应用程序中常用的安全机制,它可以防止跨站请求伪造攻击,但会给爬虫造成一定的困扰.本文将介绍在使用 Python3 爬虫时,处理 CSRF-Token 机制需要 ...

  2. ceph存储介绍

    一.ceph简介 ceph是一个开源的.统一的分布式存储系统,设计初衷是提供较好的性能.可靠性和可扩展性.其中"统一"是说ceph可以一套存储系统同时提供块存储设备.文件系统存储和 ...

  3. pyqt点击右上角关闭界面但子线程仍在运行

    现象: 通过右上角的叉关闭图形界面后,程序运行的子线程却不会被自动关闭,依然留存在系统中 原因: 子线程没有正确关闭 解决方法: 1.将子线程设置成守护线程 self.your_thread = th ...

  4. jdk11.0.2下载安装-环境配置

    下载 JDK下载地址https://www.oracle.com/technetwork/java/javase/downloads/index.html 然后同意,选择自己适合的版本 PS: 1.z ...

  5. React-Native开发鸿蒙NEXT-cookie设置

    React-Native开发鸿蒙NEXT-cookie设置 应用有个积分商城,做一些积分兑换的业务,就一个基于react-native-webview开发的页面,在页面加载的时候通过js注入来设置co ...

  6. 网络 | Linux ping任何ip均出现 Destination Host Unreachable 排查思路与方法

    Linux ping任何地址出现 Destination Host Unreachable 基本的排错步骤如下: 1.ping 127.0.0.1ping的通说明tcp协议栈没有问题 2.ping 主 ...

  7. AES简介以及配合Base64实现加密解密

    一.对称加密 1.什么是对称加密 对称加密就是指加密和解密使用同一个密钥的加密方式. 2.对称加密的工作过程 发送方使用密钥将明文数据进行加密成密文,发送给接收方,接收方收到密文后,使用同一个密钥将密 ...

  8. win10 hyper-v 配置教程

    非家庭版跳过以下这一步. pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt ...

  9. Error: Activity class MainActivity does not exist.

    这是一个熟悉而又陌生的错误,当年做的第一个React-Native项目就有这个错误,一直没有解决,今天又出现了,原因是我改了项目文件夹的名称,用Android Studio重新打开之后,就又出现了这个 ...

  10. 数栈运维案例:云上RAC部署、运维及实践案例

    数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...