JEP:Java表达式分析器
文档: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表达式分析器相关推荐
- 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 ...
- Jep java表达式分析器
JEP是Java expression parser的简称,即java表达式分析器,Jep是一个用来转换和计算数学 表达式的java库.通过这个程序包,用户可以以字符串的形式输入一个.任意的公式,然后 ...
- java表达式类型自动提升
[一道经典的Java面试题] short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 答案是:前者错,后者对.相信不管是否经历过java ...
- java表达式语法格式为_2009(选修)JavaWeb模拟试卷(2011-2012)
第 1 页 共 3 页 成都学院(成都大学)考试试卷 课程名称:_ JavaWeb (闭卷) _2011_-_2012_学年 第_2_学期 一. 填空题(每空3分,共30分) 1.在Tomcat 上发 ...
- java表达式1 2_Aviator 2.1.1 发布,Java表达式引擎
Java 表达式解释引擎--aviator发布2.1.1,主要做的改进如下: 1,性能改进,最新的性能测试表明aviator的性能已经接近甚至超过Groovy 1.8.具体请看这个性能测试报告,当然, ...
- java 运算符_详解Java表达式与运算符
课程导言 [变量的赋值与计算都离不开表达式,表达式的运算依赖于变量.常量和运算符.本节课讨论Java的表达式的构成.常量的定义.运算符的分类及应用.通过本课的学习你将掌握运用表达式和运算符完成变量赋值 ...
- Atitti.java exp ast java表达式语法ast构造器
Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_sli ...
- 从下列选项中选择正确的java表达式,java笔试常见的选择题
1.已知表达式int m[] = {0,1,2,3,4,5,6}; 下面那个表达式的值与数组的长度相等() A m.length() B. m.length C. m.length()+1 D. m. ...
- java AST 表达式_Atitti.java exp ast java表达式语法ast构造器
Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_sli ...
- Java表达式运算工具类
对于表达式的运算转换工具类,使用场景,例如前端文本框让用户输入了加减乘除运算,工具类智能转换. 资源下载:Java表达式工具类,用于加减乘除等智能转换-Java文档类资源-CSDN下载 例如: pub ...
最新文章
- winpython是个坑_Win10 Python MySQLdb安装爬的坑
- 旅游网站的主页代码_一个在优化的网站主页内容应该如何设计?
- uniapp一键登陆(php)
- Matlab中求数据概率分布的方法
- DataFountain新上两项CV算法竞赛(文化传承——汉字书法多场景识别、大数据医疗——肝癌影像AI诊断)——50万巨奖等你来拿!
- android 动画_深入了解一些Android动画
- VsCode配置Python项目的setting.json和launch.json两个配置文件
- Java调用db2cmd命令导出数据
- GoLang使用sync.Once
- hexo(sakura)仿gitee添加文章贡献度日历图(echarts)
- audio realtek 耳机没声_realtek hd audio output 耳机听歌没声音要咋设置?华硕主板a88xm-a插了耳机音响还响咋了...
- 从gitlab迁移到极狐gitlab的方法 #JIHULAB101
- ●「.|貓」erPhotoshop滤镜巧制超级美女插画效果
- 滨州智能dcs系统推荐_滨州NIPCI-7811R【四点零自动化】DCS系统
- 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下)
- 画一手好的架构图是码农进阶的开始
- oracle 的lag,LAG函数的使用
- linux安装xp系统安装教程视频教程,Linux系统怎么安装Win7?Linux下安装XP/WIN7系统图文详细教程...
- Linux使用基础(目录)顶顶顶
- 内网穿透(natapp的使用)
热门文章
- 0906--学成在线页面案例
- 淘宝客工具箱源码,一键转链,淘口令解析 淘宝客中间页生成
- 高等代数(第三版)北大(参考答案)
- python3.5中文手册chm_python3官方帮助文档-python3.5.2官方chm参考手册-东坡下载
- Android显示PDF文件之PDFviewer
- 电力仿真, 电力可视化源码库,MATLAB仿真,Multisim仿真,PSASP仿真, 电力地理接线图,VC++ 控件源程序
- 解决vagrant up出现:An error occurred while downloading the remote file. The errormessage
- msmms (二) sms与mms 简述!
- ECharts地图,echarts自定义map地图,echarts添加标注,自定义坐标、图标、icon
- 用PARL训练mini-alphaGO