AviatorScript轻量级Java表达式解析工具
github:https://github.com/killme2008/aviatorscript
教程:https://www.yuque.com/boyan-avfmj/aviatorscript
viatorScript
是一门高性能、轻量级寄宿于 JVM 之上的脚本语言。
特性介绍
- 支持数字、字符串、正则表达式、布尔值、正则表达式、三元表达式等基本类型,完整支持所有 Java 运算符及优先级等。
- 函数是一等公民,支持闭包和函数式编程。
- 内置 bigint/decmal 类型用于大整数和高精度运算,支持运算符重载得以让这些类型使用普通的算术运算符
+-*/
参与运算。 - 完整的脚本语法支持,包括多行数据、条件语句、循环语句、词法作用域和异常处理等。
- 函数式编程结合 Sequence 抽象,便捷处理任何集合。
- 轻量化的模块系统。
- 多种方式,方便地调用 Java 方法,完整支持 Java 脚本 API(方便从 Java 调用脚本)。
- 丰富的定制选项,可作为安全的语言沙箱和全功能语言使用。
- 轻量化,高性能,通过直接将脚本翻译成 JVM 字节码,AviatorScript 的基础性能较好。
使用场景包括:
- 规则判断及规则引擎
- 公式计算
- 动态脚本控制
- 集合数据 ELT 等 ……
News
- 5.2.5,调用 java 方法数值装箱类型自动转换、修复 bug 等。
- 5.2.4,unpacking arguments(类 python 语法)、使用
fn
定义匿名函数和改进 for 语句支持索引、KV 键值等。 - 5.2.3,移除 commons-beantuils、性能优化和修复
AviatorString#toString
打印警告日志等。
Dependency
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>{version}</version>
</dependency>
可以在 search.maven.org 查看可用的版本。
快速开始
- 下载 aviator shell 到某个目录(最好是在系统的
PATH
环境变量内),比如~/bin/aviator
:
$ wget https://raw.githubusercontent.com/killme2008/aviator/master/bin/aviator
$ chmod u+x aviator
- 执行
aviator
命令,将自动下载最新文档版本 aviator jar 到~/.aviatorscript
下的安装目录并运行:
$ aviator
Downloading AviatorScript now...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 153 100 153 0 0 111 0 0:00:01 0:00:01 --:--:-- 111
100 1373k 100 1373k 0 0 689k 0 0:00:01 0:00:01 --:--:-- 689k
Usage: java com.googlecode.aviator.Main [file] [args]
: java com.googlecode.aviator.Main -e [script]
: java com.googlecode.aviator.Main -v
- 将下面这个脚本保存为文件
hello.av
:
p("Hello, AviatorScript!");
let a = tuple(1, 2, 3, 4, 5);
p("sum of a is: " + reduce(a, +, 0));
let date = new java.util.Date();
p("The year is: "+ getYear(date));
p("The month is: #{getMonth(date)}");
- 执行脚本:
$ aviator hello.av
Hello, AviatorScript!
sum of a is: 15
The year is: 120
The month is: 3
示例:
public static void main(String[] args) {
Map<String,Object> params = new HashMap<>();
// params.put("T",null);
params.put("P",new BigDecimal(20));
params.put("L",100);
params.put("W",500);
params.put("Q",3);
// P*L*W*Q 可以写作 T=P*L*W*Q
Expression compiledExp = AviatorEvaluator.compile("T=P*L*W*Q");
BigDecimal totalPrice = (BigDecimal) compiledExp.execute(params);
System.out.println("totalPrice : "+totalPrice);
}
更详细的请阅读用户指南。
三元表达式
public static void main(String[] args) {
String expression = "W*L<0.1?0.1*329*P:W*L*329*P";
Map<String,Object> params = new ConcurrentHashMap<>();
params.put("W",new BigDecimal(0.1));
params.put("L",new BigDecimal(0.5));
params.put("P",new BigDecimal(1));
BigDecimal finalPrice= BigDecimal.ZERO;
Expression compiledExp = AviatorEvaluator.compile(expression);
try {
finalPrice = (BigDecimal) compiledExp.execute(params);
} catch (ClassCastException e) {
if(compiledExp.execute(params) instanceof Double
|| compiledExp.execute(params) instanceof Float
|| compiledExp.execute(params) instanceof Integer){
Double doubleVal = (Double)compiledExp.execute(params);
finalPrice = new BigDecimal(doubleVal);
}
}catch (Exception e) {
e.printStackTrace();
finalPrice =BigDecimal.ZERO;
}
finalPrice = finalPrice.setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("finalPrice:"+finalPrice);
String result5=(String)AviatorEvaluator.execute("3>0? 'yes':'no'");
System.out.println(result5);
}
Links
- Releases: https://github.com/killme2008/aviator/releases
- Documents: https://www.yuque.com/boyan-avfmj/aviatorscript
- Changelog: https://www.yuque.com/boyan-avfmj/aviatorscript/bggwx2
- Javadoc: http://fnil.net/aviator/apidocs/
- Spring boot rule: https://github.com/mengxiangrui007/spring-boot-rule-jsr94
- Idea plugin: https://github.com/yanchangyou/aviatorscript-ideaplugin
纸上得来终觉浅,绝知此事要躬行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2023-09-17 Linux CentOS 6.5nginx +tomcat +redis分布式web应用的session共享配置
2023-09-17 Docker快速实现Redis环境安装