jep
JEP是Java expression parser的简称,即java表达式分析器,Jep是一个用来转换和计算数学表达式的java库。通过这个程序包,用户可以以字符串的形式输入一个、任意的公式,然后快速地计算出结果。Jep支持用户自定义变量、常量和函数。包括许多常用的数学函数和常。

一、在pom文件中引jep的jar包:

<!-- https://mvnrepository.com/artifact/org.scijava/jep --><dependency><groupId>org.scijava</groupId><artifactId>jep</artifactId><version>2.4.2</version></dependency>

二、工具类

直接上代码

/*** @description: 数学公式解析计算* @author: jxq* @date: 2021/3/25 12:44 下午* @version: 1.0**/
public class ExpressionUtil {/*** 动态配置公式方式** @param mapList* @param conditionExpr* @param formulaExpr* @param evaluate*/public static void workOutListMap(List<Map> mapList, String conditionExpr, String formulaExpr, String evaluate) {for (Map map : mapList) {JEP jep = getJEP(map);workOutKey(jep, map, conditionExpr, formulaExpr, evaluate);}}/*** 动态配置公式方式** @param map* @param conditionExpr* @param formulaExpr* @param evaluate*/public static void workOutMap(Map map, String conditionExpr, String formulaExpr, String evaluate) {JEP jep = getJEP(map);workOutKey(jep, map, conditionExpr, formulaExpr, evaluate);}/*** 计算出表达式并填充** @param jep* @param map* @param conditionExpr* @param formulaExpr* @param evaluate*/private static void workOutKey(JEP jep, Map map, String conditionExpr, String formulaExpr, String evaluate) {//如果没有条件if (StringUtil.isEmpty(conditionExpr)) {map.put(evaluate, workOutSingle(jep, formulaExpr));//如果有条件 且条件为true} else if (workOutBool(jep, conditionExpr)) {map.put(evaluate, workOutSingle(jep, formulaExpr));}}/*** 判断条件表达式** @param jep* @param expression* @return*/private static boolean workOutBool(JEP jep, String expression) {return (Double) workOutSingle(jep, expression) > 0;}/*** 计算表达式的值** @param jep* @param expression* @return*/private static Object workOutSingle(JEP jep, String expression) {Object result = null;try { //执行Node parse = jep.parse(expression);result = jep.evaluate(parse);} catch (ParseException e) {throw new MyException(101, "公式表达式解析失败");}if (result == null) {throw new MyException(101, "公式表达式解析失败");}return result;}/*** 获取填充好变量的JEP对象** @param param* @return*/private static JEP getJEP(Map param) {JEP jep = new JEP();Set<Map.Entry> set = param.entrySet();for (Map.Entry entry : set) {Object entryValue = entry.getValue();String entryKey = (String) entry.getKey();jep.addVariable(entryKey, entryValue);}return jep;}
}

三、main方法测试一下

public static void main(String[] args) {List<Map> mapList = new ArrayList<>();Map map = new HashMap() {{put("a", 4);put("b", 0);put("c", 3);}};Map map2 = new HashMap() {{put("a", 4);put("b", 0);put("c", 3);}};Map map3 = new HashMap() {{put("ecpm", 400);put("n", 1);put("c", 3);}};mapList.add(map);mapList.add(map2);ExpressionUtil.workOutListMap(mapList, "a > 3 && b > 1", "a+b+c * 2", "res");ExpressionUtil.workOutListMap(mapList, "a > 3 && b < 1", "a+b+c * 3", "res");ExpressionUtil.workOutListMap(mapList, "a < 0", "a+b+c", "res");ExpressionUtil.workOutMap(map3, "n <= 3", "ecpm * (4.5 - 0.5 * n)", "res");System.out.println(map3.get("res"));for (Map m : mapList) {System.out.println(m.get("res"));}}

用JEP+SpringBoot进行动态公式处理计算相关推荐

  1. excel输入公式不计算_Excel公式不计算

    excel输入公式不计算 What happens when good Excel formulas go bad? A workbook of mine that worked fine for s ...

  2. 表达式的动态解析和计算,Flee用起来真香

    前言 在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出:由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的 ...

  3. Java利用注解实现配置动态公式并结合POI导出Excel

    利用注解实现动态配置公式并结合POI导出Excel 实现思想 创建导出对象 创建使用注解类 创建封装导出对象属性类 创建测试类 创建ExcelUtil类 实现效果 实现思想 实施顾问提出导出Excel ...

  4. 输入textbox在datagridview显示结果_Excel输入正确的公式,计算出错,根本没计算解决技巧...

    当我们在工作中处理表格的时候,公式明明已经检查了很多次,没有问题,但是计算的结果总是出错了,或者根本就不进行计算,今天分享两种工作中常碰到令人头痛的场景 1.公式计算出错,结果全一样 如下所示,我们在 ...

  5. oracle 统计一年中每个月数据总和_excel表格有每月数据 怎样统计全年的-用excel公式怎样计算每年每个月的数据总和?...

    excel表格中如何统计1月到12月的数据 我用的是Excel07版为你的表已经是存在的,并能力有限,所只能给你说下面这一种方法了,用着也单的!下边我做一个示范: 第一步 在Excel表格右侧空白任意 ...

  6. 利用Java的BigDecimal与马青公式精确计算π后10000位,

    首先给出公式如下: π=16arctan1/5−4arctan1/239: 即是 π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)-)−4×(1/(1×239)−1/(3×2 ...

  7. Master公式(计算递归复杂度)

    Master公式 在计算涉及递归的算法的时候,计算复杂度就会变得有些麻烦.Master公式就是用来进行剖析递归行为和递归行为时间复杂度的估算的 Master公式:T(N) = a*T(N/b) + O ...

  8. excel公式不自动计算_WPS表格仅显示公式不计算结果怎么办

    在工作中我们经常会用到WPS表格和Excel进行数据的计算,但是有时会遇到一个很糟心的情况:明明输入了正确的公式,怎么会不计算结果而是只显示公式呢?这是什么情况?遇到又应该怎么解决呢?一起来看一下吧! ...

  9. 用bbp公式计算pi_家用配电箱里设计几个回路合适?用这个公式,计算起来很方便...

    原标题:家用配电箱里设计几个回路合适?用这个公式,计算起来很方便 确定数量 家庭配电箱的数量应该是1(主开关)+2(1~2个照明回路)+a(房间回路)+b(大功率回路). 照明回路数量,由房间面积大小 ...

  10. 不背公式快速计算IP地址掩码---游码法

    专注网络运维,只发实用干货 扫描二维码关注公众 不背公式快速计算IP地址掩码---游码法 网工老张 网工大杂烩  这个方法来自于大学时期某位已经被我忘记名字的老师(老师对不起了),思路是将2^n次方( ...

最新文章

  1. less及编译工具介绍
  2. ANT集成SVNANT访问SVN(Subversion)
  3. 任艳频老师关于信息与大数据课题组的讨论材料的意见
  4. NYOJ 595 乱七八糟
  5. 【嵌入式】C语言高级编程-内建函数(11)
  6. Tax debug and BP number external generation
  7. 盘点Spring Boot最核心的27个注解
  8. Java 给编译器看的注释--Annotation
  9. 04.监控过程组-偏差分析
  10. 未能加载文件或程序集 CrystalDecisions.Web Version=10.2.3600解决方法
  11. trace (矩阵的迹) 的性质
  12. 主成分分析在生命科学研究中的应用
  13. 虚拟机Linux服务器网络设置
  14. macos复制粘贴快捷键 快速_Mac复制粘贴快捷键怎么修改 Mac复制粘贴快捷键修改步骤...
  15. 企业公众号都离不开的四种运营模式
  16. PostgreSQL JIT(Just-In-Time Compilation)With LLVM 的实现原理
  17. JSP 编译和运行过程与JSP源码简单分析
  18. Vue + Vuetify使用感受以及部分自定义组件
  19. Heartbleed心脏出血原理及漏洞复现(CVE-2014-0106)
  20. 4G网络数据传输流程 三

热门文章

  1. UML概要基础知识(待完善)
  2. C# winform 开发总结 -- 【持续更新】
  3. 全国计算机等级考试(NCRE)三级网络技术、四级网络工程师题库软件分享
  4. win10系统托盘图标不见了_win10托盘图标不显示怎么回事_win10任务栏托盘图标显示不完全如何修复...
  5. Yum离线安装(一) --- RPM 打包技术与典型 SPEC 文件分析
  6. Flash Player离线安装包下载指南
  7. SAP MM 顾问在实施项目工作中的苦逼和优势
  8. 计算机思维导论第二讲答案,大学计算机计算思维导论第2讲习题及解析
  9. shp地图如何导入奥维地图手机_奥维地图如何导入文件 奥维地图导出文件在哪...
  10. 计算机组成与系统结构第二版答案