首页 > 编程语言 >Java表达式计算工具-Aviator的使用

Java表达式计算工具-Aviator的使用

时间:2022-09-04 19:33:45浏览次数:90  
标签:Java double long av Aviator 表达式

Java表达式计算工具-Aviator的使用

添加依赖:

<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>5.3.0</version>
</dependency>

Aviator 有两种常用的使用方式:

  • 直接在Java代码中使用(表达式运算)
  • 在.av脚本文件中使用

直接在Java代码中

基本使用: 引入依賴直接在Java代码中传入需要计算的表达式和变量的值

@Test
public void test1() {
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("x", 12);
    paramMap.put("y", 10);
    String expression = "x + y";
    Long value = (Long) AviatorEvaluator.compile(expression).execute(paramMap);
    Assert.isTrue(NumberUtil.equals(value, 22L));
    log.info("计算成功: {} = {}", expression, value);
}

如上面代码所示:基本使用非常简单。直接使用AviatorEvaluator类提供的方法即可, 使用Map<String, Object>
来传递表达式的参数。需要注意的是,传递参数的Map的Value类型必须是Object,
且计算返回的值默认是Object类型,需要根据代码上下文转换为所需要的类型。

av脚本中使用

先写一个.av的脚本, 语法和JS有点相似

脚本目录:resources/av/test1.av

let a = 1;
let c = -2;

println(a + b);

再在Java代码中调用执行

@Test
public void testSimpleAvScript() {
    Expression expression = AviatorEvaluator.getInstance().compileScript("av/test1.av");
    expression.execute();
}

Aviator计算数字类型转换

  • 传入整数:无论Java代码中传入的整数是byte/stort/int/long 都会被转换成long,对于比long大的数会被转换成BigInteger, 若表达式中有数字以N结尾,Aviator自动识别为BigInteger。

  • 传入浮点数:无论Java代码中传入float/double都会被转换成double。

  • 精确计算:Aviator中的BigDecimal对应BigDecimal,当在Java中传入BigDecimal类型的数或表达式中有以M结尾的数都会被解析成BigDecimal。

  • 单一类型参与的运算,结果仍然为该类型,比如整数和整数相除仍然是整数,double 和 double 运算结果还是 double。

  • 多种类型参与的运算,按照下列顺序: long -> bigint -> decimal -> double 自动提升,比如 long 和 bigint 运算结果为 bigint, long 和 decimal 运算结果为 decimal,任何类型和 double 一起运算结果为 double

参考文档:

AviatorScript相关语法详情请: https://www.yuque.com/boyan-avfmj/aviatorscript/lvabnw

标签:Java,double,long,av,Aviator,表达式
From: https://www.cnblogs.com/annamaple/p/16655762.html

相关文章

  • Java集合
    集合java集合分为Collection和Map集合Collecttion接口List元素有序(指的是存储时,与存放顺序保持一致)、可重复的集合Set元素无序、不可重复的集合Map......
  • Java异常处理机制
    异常Exception:#1.什么是异常##简单分类:要理解java异常处理是如何工作的,需要掌握以下三种类型的异常:检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程......
  • 生成allure报告报错:Exception in thread "main" java.lang.NoClassDefFoundError: com
     报错如图:  问题解决经过:从报错中看刚开始以为是java版本问题,然后就尝试换了jdk11(我本地之前是jdk8,也就是jdk1.8),但是换了之后还是不行,然后以为是allure没有装好......
  • Java基础-原码、反码、补码的理解
    注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码。 一.原码1>.正数的原码就是它的本身假设使用一个字节存储整数,整数10......
  • 数据结构与算法【Java】05---排序算法总结
    前言数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。要学习好数据结构就......
  • 2022java-web一条龙工具安装
    @目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk备忘~安装常见......
  • 2022java-web一条龙工具安装
    @目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk备忘~安装常见......
  • Java-tomcat
    TomcatTomcat是一个免费的web服务器8080是tomcat的默认端口号(手动可更改)下载tomcat后各个文件的作用:bin:一些初始化脚本conf:配置文件lib:依赖的jar包logs:日志web......
  • java随笔(六)——对象序列化
    ObjectOutputStream(对象输出流,序列化)通过ObjectOutputStream可以将所需要存储的对象数据进行序列化再输出存储。例如:Students=newStudent("张三",19);ObjectOutput......
  • Java中的方法
    方法的定义定义方法的格式修饰符返回值类型方法名(参数类型){***}修饰符访问控制修饰符publicprivateprotected当父类声明为public时,子类必须为public当父类声......