JEP 是一个用于解析和计算数学表达式的 Java 类库。通过使用这个包你可以把公式看
作字符串并快速计算它们。其中内置了大量公共的数学函数和常量供用户使用。另外,你也
可以通过自定义变量、常量、函数等方式扩展 JEP。
使用 JEP 计算一个字符串表达式包括两个步骤,如下图所示。首先是解析表达式,从
字符串结构解析为树形结构。表达式的树形结构表示允许接下来的简单、快速的表达式计算。

文档:Jep说明文档_jep,javajep-Java文档类资源-CSDN下载

测试代码:

        <!-- jep java表达式分析器 --><dependency><groupId>com.singularsys</groupId><artifactId>jep</artifactId><version>3.5</version><classifier>trial</classifier></dependency>
import com.singularsys.jep.PostfixMathCommandI;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author lihai* Create Date: 2021-11-20*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JepFunctionPo {private String name;private PostfixMathCommandI function;
}
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.qms.ipqc.common.po.JepFunctionPo;
import com.quality.common.exception.DangerException;
import com.quality.common.exception.GeneralException;
import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;
import com.singularsys.jep.Variable;
import com.singularsys.jep.VariableTable;
import com.singularsys.jep.bigdecimal.BigDecComponents;
import com.singularsys.jep.functions.*;import java.math.BigDecimal;
import java.math.MathContext;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;/*** @author lihai* Create Date: 2021-11-20*/
public class JepAnalysisUtil {public static List<JepFunctionPo> getDefaultJepFunctionPoList() {return Arrays.asList(
//                new JepFunctionPo("round", new Round()),
//                new JepFunctionPo("rint", new RInt()),
//                new JepFunctionPo("floor", new Floor()),
//                new JepFunctionPo("ceil", new Ceil()),
//                new JepFunctionPo("abs", new Abs()),new JepFunctionPo("sqrt", new SquareRoot()),new JepFunctionPo("SQRT", new SquareRoot()));}public static Jep newJep(List<JepFunctionPo> functions) {Jep jep = new Jep(new BigDecComponents(MathContext.DECIMAL128));if (ObjectUtil.isNotEmpty(functions)) {functions.forEach(function -> jep.addFunction(function.getName(), function.getFunction()));}return jep;}public static Jep parse(String expression) {Jep jep = newJep(getDefaultJepFunctionPoList());try {jep.parse(expression);return jep;} catch (Exception e) {throw new DangerException("JEP解析表达式失败:" + expression + ",请检查表达式是否合法!");}}public static BigDecimal analysis(String expression, Map<String, Object> variables) {Jep jep = parse(expression);try {if (ObjectUtil.isNotEmpty(variables)) {variables.forEach((k, v) -> {try {jep.addVariable(k, NumberUtil.parseNumber(v.toString()));} catch (JepException e) {throw new DangerException("JEP赋值异常:" + e.getMessage());}});}return new BigDecimal(jep.evaluate().toString());} catch (JepException e) {throw new GeneralException("JEP计算异常:" + e.getMessage());}}public static Set<String> getVariables(String expression) {Jep jep = parse(expression);try {final VariableTable variableTable = jep.getVariableTable();final List<Variable> variables = new ArrayList<>(variableTable.getVariables());return variables.stream().filter(var -> var.getValue() == null).map(Variable::getName).collect(Collectors.toSet());} catch (Exception e) {throw new DangerException("获取JEP变量失败:" + expression);}}public static void checkExpressionVariables(String expression, Set<String> variables) {final Set<String> expressionVariables = getVariables(expression);for (String var : expressionVariables) {if (!variables.contains(var)) {throw new DangerException(String.format("表达式:%s 缺少变量:%s", expression, var));}}}}

测试方法:

    @Testvoid jepAnalysis() {String expression = "sqrt(a-b+c*d/e)";Map<String, Object> params = new HashMap<String, Object>() {{put("a", 5);put("b", 1);put("c", 3);put("d", 2);put("e", 2);}};final BigDecimal analysis = JepAnalysisUtil.analysis(expression, params);System.out.println("计算结果:" + analysis);}

JEP:Java表达式分析器相关推荐

  1. jep(java表达式分析器)简介

    文章目录 1 简介 2 使用 2.1 pom引用 2.2 java案例 2.2.1 基本使用 2.2.2 使用内置函数 2.2.3 自定义函数 2.2.4 变量 3 特殊情况 3.1 错误判断 3.2 ...

  2. Jep java表达式分析器

    JEP是Java expression parser的简称,即java表达式分析器,Jep是一个用来转换和计算数学 表达式的java库.通过这个程序包,用户可以以字符串的形式输入一个.任意的公式,然后 ...

  3. java表达式类型自动提升

    [一道经典的Java面试题] short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 答案是:前者错,后者对.相信不管是否经历过java ...

  4. java表达式语法格式为_2009(选修)JavaWeb模拟试卷(2011-2012)

    第 1 页 共 3 页 成都学院(成都大学)考试试卷 课程名称:_ JavaWeb (闭卷) _2011_-_2012_学年 第_2_学期 一. 填空题(每空3分,共30分) 1.在Tomcat 上发 ...

  5. java表达式1 2_Aviator 2.1.1 发布,Java表达式引擎

    Java 表达式解释引擎--aviator发布2.1.1,主要做的改进如下: 1,性能改进,最新的性能测试表明aviator的性能已经接近甚至超过Groovy 1.8.具体请看这个性能测试报告,当然, ...

  6. java 运算符_详解Java表达式与运算符

    课程导言 [变量的赋值与计算都离不开表达式,表达式的运算依赖于变量.常量和运算符.本节课讨论Java的表达式的构成.常量的定义.运算符的分类及应用.通过本课的学习你将掌握运用表达式和运算符完成变量赋值 ...

  7. Atitti.java exp ast java表达式语法ast构造器

    Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_sli ...

  8. 从下列选项中选择正确的java表达式,java笔试常见的选择题

    1.已知表达式int m[] = {0,1,2,3,4,5,6}; 下面那个表达式的值与数组的长度相等() A m.length() B. m.length C. m.length()+1 D. m. ...

  9. java AST 表达式_Atitti.java exp ast java表达式语法ast构造器

    Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_sli ...

  10. Java表达式运算工具类

    对于表达式的运算转换工具类,使用场景,例如前端文本框让用户输入了加减乘除运算,工具类智能转换. 资源下载:Java表达式工具类,用于加减乘除等智能转换-Java文档类资源-CSDN下载 例如: pub ...

最新文章

  1. winpython是个坑_Win10 Python MySQLdb安装爬的坑
  2. 旅游网站的主页代码_一个在优化的网站主页内容应该如何设计?
  3. uniapp一键登陆(php)
  4. Matlab中求数据概率分布的方法
  5. DataFountain新上两项CV算法竞赛(文化传承——汉字书法多场景识别、大数据医疗——肝癌影像AI诊断)——50万巨奖等你来拿!
  6. android 动画_深入了解一些Android动画
  7. VsCode配置Python项目的setting.json和launch.json两个配置文件
  8. Java调用db2cmd命令导出数据
  9. GoLang使用sync.Once
  10. hexo(sakura)仿gitee添加文章贡献度日历图(echarts)
  11. audio realtek 耳机没声_realtek hd audio output 耳机听歌没声音要咋设置?华硕主板a88xm-a插了耳机音响还响咋了...
  12. 从gitlab迁移到极狐gitlab的方法 #JIHULAB101
  13. ●「.|貓」erPhotoshop滤镜巧制超级美女插画效果
  14. 滨州智能dcs系统推荐_滨州NIPCI-7811R【四点零自动化】DCS系统
  15. 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下)
  16. 画一手好的架构图是码农进阶的开始
  17. oracle 的lag,LAG函数的使用
  18. linux安装xp系统安装教程视频教程,Linux系统怎么安装Win7?Linux下安装XP/WIN7系统图文详细教程...
  19. Linux使用基础(目录)顶顶顶
  20. 内网穿透(natapp的使用)

热门文章

  1. 0906--学成在线页面案例
  2. 淘宝客工具箱源码,一键转链,淘口令解析 淘宝客中间页生成
  3. 高等代数(第三版)北大(参考答案)
  4. python3.5中文手册chm_python3官方帮助文档-python3.5.2官方chm参考手册-东坡下载
  5. Android显示PDF文件之PDFviewer
  6. 电力仿真, 电力可视化源码库,MATLAB仿真,Multisim仿真,PSASP仿真, 电力地理接线图,VC++ 控件源程序
  7. 解决vagrant up出现:An error occurred while downloading the remote file. The errormessage
  8. msmms (二) sms与mms 简述!
  9. ECharts地图,echarts自定义map地图,echarts添加标注,自定义坐标、图标、icon
  10. 用PARL训练mini-alphaGO