天下之事,必先处之难,而后易之。

AviatorScript轻量级Java表达式解析工具

github:https://github.com/killme2008/aviatorscript

教程:https://www.yuque.com/boyan-avfmj/aviatorscript

viatorScript 是一门高性能、轻量级寄宿于 JVM 之上的脚本语言。

特性介绍

  1. 支持数字、字符串、正则表达式、布尔值、正则表达式、三元表达式等基本类型,完整支持所有 Java 运算符及优先级等。
  2. 函数是一等公民,支持闭包和函数式编程
  3. 内置 bigint/decmal 类型用于大整数和高精度运算,支持运算符重载得以让这些类型使用普通的算术运算符 +-*/ 参与运算。
  4. 完整的脚本语法支持,包括多行数据、条件语句、循环语句、词法作用域和异常处理等。
  5. 函数式编程结合 Sequence 抽象,便捷处理任何集合。
  6. 轻量化的模块系统
  7. 多种方式,方便地调用 Java 方法,完整支持 Java 脚本 API(方便从 Java 调用脚本)。
  8. 丰富的定制选项,可作为安全的语言沙箱和全功能语言使用。
  9. 轻量化,高性能,通过直接将脚本翻译成 JVM 字节码,AviatorScript 的基础性能较好。

使用场景包括:

  1. 规则判断及规则引擎
  2. 公式计算
  3. 动态脚本控制
  4. 集合数据 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 查看可用的版本。

快速开始

  1. 下载 aviator shell 到某个目录(最好是在系统的 PATH 环境变量内),比如 ~/bin/aviator:
$ wget https://raw.githubusercontent.com/killme2008/aviator/master/bin/aviator
$ chmod u+x aviator
  1. 执行 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
  1. 将下面这个脚本保存为文件 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)}");
  1. 执行脚本:
$ 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

posted @   boonya  阅读(109)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 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环境安装
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。

点击右上角即可分享
微信分享提示