aviator表达式教程

2023-11-09

Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。

特性包括:

  1. 支持绝大多数运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(=~)、三元表达式(?:)
  2. 支持操作符优先级和括号强制设定优先级
  3. 逻辑运算符支持短路运算。
  4. 支持丰富类型,例如nil、整数和浮点数、字符串、正则表达式、日期、变量等,支持自动类型转换。
  5. 内置一套强大的常用函数库
  6. 可自定义函数,易于扩展
  7. 可重载操作符
  8. 支持大数运算(BigInteger)和高精度运算(BigDecimal)
  9. 性能优秀

 

下面来正式使用:

先引入依赖

 

<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>3.3.0</version>
</dependency>

写个简单的用法,先来了解这个表达式:

 

package com.xzg.aviator;

import com.googlecode.aviator.AviatorEvaluator;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2018/5/22.
 *
 * @author XieZG
 * @date 2018/5/22
 */
public class TestCalc {
    public static void main(String[] args) {
        int[] a = new int[]{6, 7, 8, 9};
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("a", a);

        System.out.println(AviatorEvaluator.execute("1 + 2 + 3"));
        System.out.println(AviatorEvaluator.execute("a[1] + 100", env));
        System.out.println(AviatorEvaluator.execute("'a[1]=' + a[1]", env));
        //求数组长度
        System.out.println(AviatorEvaluator.execute("count(a)", env));
        //求数组总和
        System.out.println(AviatorEvaluator.execute("reduce(a, +, 0)", env));
        //检测数组每个元素都在 0 <= e < 10 之间。
        System.out.println(AviatorEvaluator.execute("seq.every(a, seq.and(seq.ge(0), seq.lt(10)))", env));
    }
}

可以看到aviator支持运算,取值,还有一个内置函数可以用。有些童鞋可能不太了解,说这些直接写java程序也能做,为啥要用表达式。其实是有些场景需要使用它,比如风控系统,是要给业务配置表达式的,然后程序执行它,总不可能每次业务规则变更都要程序员来改吧。

而且aviator里还有reduce,sort等高阶函数,可以简化开发哦。

上面代码频繁使用了一个类com.googlecode.aviator.AviatorEvaluator,这个就是aviator表达式的入口类,所有表达式的使用都是通过这个类的。

 

然后再来个进阶的用法:

 

package com.xzg.aviator;

import com.googlecode.aviator.AviatorEvaluator;
import lombok.Data;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2018/5/22.
 *
 * @author XieZG
 * @date 2018/5/22
 */
public class TestAviator {
    private String aa="jack";

    public String getAa() {
        return aa;
    }

    public void setAa(String aa) {
        this.aa = aa;
    }

    public static void main(String[] args) {
        Map<String, Object> env = new HashMap<String, Object>();
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(20);
        list.add(10);
        env.put("list", list);
        env.put("email", "killme2008@gmail.com");
        env.put("test", new TestAviator());
        env.put("date",new Date());
        String username = (String) AviatorEvaluator.execute("email=~/([\\w0-8]+)@\\w+[\\.\\w+]+/ ? $1 : 'unknow' ", env);
        System.out.println(username);
        System.out.println(AviatorEvaluator.exec("a>0? 'yes':'no'", 1));
        System.out.println(AviatorEvaluator.execute("'test.aa ='+test.aa", env));
        System.out.println(AviatorEvaluator.execute(" obj==nil", env));
        System.out.println(AviatorEvaluator.execute(" date > '2018-05-21 00:00:00:00'", env));
        System.out.println(AviatorEvaluator.execute(" date > '2018-05-22 12:00:00:00'", env));

        Object result = AviatorEvaluator.execute("count(list)", env);
        System.out.println(result);  // 3
        result = AviatorEvaluator.execute("reduce(list,+,0)", env);
        System.out.println(result);  // 33
        result = AviatorEvaluator.execute("filter(list,seq.gt(9))", env);
        System.out.println(result);  // [10, 20]
        result = AviatorEvaluator.execute("include(list,10)", env);
        System.out.println(result);  // true
        result = AviatorEvaluator.execute("sort(list)", env);
        System.out.println(result);  // [3, 10, 20]
        AviatorEvaluator.execute("map(list,println)", env);
    }
}

简单说下,里面有正则,三元,null判断,对象属性获取,还有一些集合函数。

其实aviator支持的函数还挺多的:

 

内置函数

函数名称 说明
sysdate() 返回当前日期对象 java.util.Date
rand() 返回一个介于 0-1 的随机数,double 类型
rand(n) 返回一个介于 0- n 的随机数,long 类型
print([out],obj) 打印对象,如果指定 out,向 out 打印, 否则输出到控制台
println([out],obj) 与 print 类似,但是在输出后换行
now() 返回 System.currentTimeMillis
long(v) 将值的类型转为 long
double(v) 将值的类型转为 double
str(v) 将值的类型转为 string
date_to_string(date,format) 将 Date 对象转化化特定格式的字符串,2.1.1 新增
string_to_date(source,format) 将特定格式的字符串转化为 Date 对 象,2.1.1 新增
string.contains(s1,s2) 判断 s1 是否包含 s2,返回 Boolean
string.length(s) 求字符串长度,返回 Long
string.startsWith(s1,s2) s1 是否以 s2 开始,返回 Boolean
string.endsWith(s1,s2) s1 是否以 s2 结尾,返回 Boolean
string.substring(s,begin[,end]) 截取字符串 s,从 begin 到 end,如果忽略 end 的话,将从 begin 到结尾,与 java.util.String.substring 一样。
string.indexOf(s1,s2) java 中的 s1.indexOf(s2),求 s2 在 s1 中 的起始索引位置,如果不存在为-1
string.split(target,regex,[limit]) Java 里的 String.split 方法一致,2.1.1 新增函数
string.join(seq,seperator) 将集合 seq 里的元素以 seperator 为间隔 连接起来形成字符串,2.1.1 新增函数
string.replace_first(s,regex,replacement) Java 里的 String.replaceFirst 方法, 2.1.1 新增
string.replace_all(s,regex,replacement) Java 里的 String.replaceAll 方法 , 2.1.1 新增
math.abs(d) 求 d 的绝对值
math.sqrt(d) 求 d 的平方根
math.pow(d1,d2) 求 d1 的 d2 次方
math.log(d) 求 d 的自然对数
math.log10(d) 求 d 以 10 为底的对数
math.sin(d) 正弦函数
math.cos(d) 余弦函数
math.tan(d) 正切函数
map(seq,fun) 将函数 fun 作用到集合 seq 每个元素上, 返回新元素组成的集合
filter(seq,predicate) 将谓词 predicate 作用在集合的每个元素 上,返回谓词为 true 的元素组成的集合
count(seq) 返回集合大小
include(seq,element) 判断 element 是否在集合 seq 中,返回 boolean 值
sort(seq) 排序集合,仅对数组和 List 有效,返回排 序后的新集合
reduce(seq,fun,init) fun 接收两个参数,第一个是集合元素, 第二个是累积的函数,本函数用于将 fun 作用在集合每个元素和初始值上面,返回 最终的 init 值
seq.every(seq, fun) fun 接收集合的每个元素作为唯一参数,返回 true 或 false。当集合里的每个元素调用 fun 后都返回 true 的时候,整个调用结果为 true,否则为 false。
seq.not_any(seq, fun) fun 接收集合的每个元素作为唯一参数,返回 true 或 false。当集合里的每个元素调用 fun 后都返回 false 的时候,整个调用结果为 true,否则为 false。
seq.some(seq, fun) fun 接收集合的每个元素作为唯一参数,返回 true 或 false。当集合里的只要有一个元素调用 fun 后返回 true 的时候,整个调用结果立即为 true,否则为 false。
seq.eq(value) 返回一个谓词,用来判断传入的参数是否跟 value 相等,用于 filter 函数,如filter(seq,seq.eq(3)) 过滤返回等于3 的元素组成的集合
seq.neq(value) 与 seq.eq 类似,返回判断不等于的谓词
seq.gt(value) 返回判断大于 value 的谓词
seq.ge(value) 返回判断大于等于 value 的谓词
seq.lt(value) 返回判断小于 value 的谓词
seq.le(value) 返回判断小于等于 value 的谓词
seq.nil() 返回判断是否为 nil 的谓词
seq.exists() 返回判断不为 nil 的谓词
seq.and(p1, p2, p3, ...) 组合多个谓词函数,返回一个新的谓词函数,当今仅当 p1、p2、p3 ...等所有函数都返回 true 的时候,新函数返回 true
seq.or(p1, p2, p3, ...) 组合多个谓词函数,返回一个新的谓词函数,当 p1, p2, p3... 其中一个返回 true 的时候,新函数立即返回 true,否则返回 false。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

aviator表达式教程 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • Backtrader量化&回测11——策略信号Indicator

    对于程序来讲 该有的代码一行都不会少 但是把代码分块就可以很直观的阅读或修改代码 使用Indicator可以将策略的信号从策略类Strategy中脱离出来 方便策略进行协调与控制 文章目录 策略信号 示例代码 策略信号 官网中对于Indic
  • Pycharm 的使用技巧( 启动界面弹出Tips的内容翻译)

    Pycharm 启动界面弹出Tips的部分内容翻译 1 ctrl N 打开类的查找框 2 在拼写类的名字时可以用ctrl 空格来补充未写完的部分 活着弹出可选项 在两次点击ctrl 空格时 将在补充完类的拼写的同时自动添加导入该类的语句 3
  • 手撕boost/buck

    手撕Boost Boost公式推导及实验验证 手撕Buck Buck公式推导过程 Boost Boost的拓扑结构 在开关导通的时候 电感两端电压U Vi不变 电感量L也是常数 di dt U L 常数 电流随时间线性变化 如果我们规定电流
  • MySQL高级篇之视图

    视图 1 介绍 视图 View 是一种虚拟存在的表 视图中的数据并不在数据库中实际存在 行和列数据来自定义视图的查询中使用的表 并且是在使用视图时动态生成的 通俗的讲 视图只保存了查询的SQL逻辑 不保存查询结果 所以我们在创建视图的时候
  • IDEA创建mybatis的xml文件

    当我们用IDEA写项目写mybatis的mapper 直接去新建xml文件的时候发现没有这个选项 我们需要去创建一个xml的file模板 这样我们去新建的时候就很方便了 1 File gt Settings 2 Editor gt File
  • Opencv画图函数整理 及 cvCircle cvLine 只能画出黑白两种颜色问题 解决

    一句话 用这些画图函数在RGB图上画 则能画出来彩色 如果您在灰度图上画 则无论怎么设置color都只能画出黑白两种颜色 就这一句话搞了我一个晚上 惭愧 Opencv绘图函数 http www opencv org cn index php
  • C语言函数大全--h开头的函数

    h开头的函数或宏 1 hypot hypotf hypotl 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 HUGE VAL HUGE VALF HUGE VALL 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ha
  • linux安装gitlab并修改gitlab默认端口号

    安装系统 centos 6 5 官网安装地址 https about gitlab com install centos 6 可以先根据官网安装步骤进行安装 分别执行以下命令 1 打开http访问和ssh访问 sudo yum instal
  • Premiere Pro 2022

    第1章 视频编辑的基础知识 1 1 视频编辑术语 帧 视频的基础单位 可以理解为一张静态图片就是一帧 关键帧 是素材中的特定帧 标记为进行特殊的编辑或其他操作 以便控制完成动画的流 回放或其他特性 帧速率 代表每秒播放帧的数量 单位是每秒多
  • 机器学习、计算机视觉和深度学习

    机器学习 计算机视觉和深度学习 1 什么是机器学习 2 机器学习的类型 3 什么是计算机视觉 4 计算机视觉的机器学习应用 5 总结 参考 这篇博客将简要介绍 机器学习和用于计算机视觉的机器学习 想象一下 你可以使用人脸检测算法在图像或视频
  • 为 Prometheus Node Exporter 加上认证

    这篇文章主要是为了庆祝 Node Exporter 终于迎来了 v1 0 0 版本 Prometheus https prometheus io 是最早由 SoundCloud 开源的监控告警解决方案 并已经成长为继 Kubernetes
  • W2NER详解

    论文 https arxiv org pdf 2112 10070 pdf 代码 https github com ljynlp W2NER 文章目录 W2NER 介绍 模型架构 解码 源码介绍 数据输入格式 模型代码 参考资料 W2NER
  • jvm学习笔记_简单了解jvm

    一 基本概念 JVM 是可运行 Java 代码的假想计算机 包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 堆 和 一个存储方法域 JVM 是运行在操作系统之上的 它与硬件没有直接的交互 二 运行过程 我们都知道java源文件 通过
  • java调用天地图api获取地理信息

    目录 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码查询 4 2逆地理编码查询 天地图网址 天地图API 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码
  • ctfshow web入门 web14

    根据题目提示查看源代码 发现编辑器路径 在url中输入 editor得到 点击文件上传发现文件空间可能有内容 editor attached file var www html nothinghere fl000g txt 访问 fl000
  • WSL2安装图形化界面

    文章目录 安装图形化界面 安装图形化界面 由于WSL2 Ubuntu默认不安装图形化界面 所以需手动安装 apt get install xfce4 使用windows powershell 查看WSL使用的IP地址 ipconfig 进入
  • vant list加载 empty空状态

  • 时序预测

    时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 目录 时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 预测效果 基本介绍 模型描述
  • python协程

    协程是实现并发编程的一种方式 一说并发 你肯定想到了多线程 多进程模型 没错 多线程 多进程 正是解决并发问题的经典模型之一 最初的互联网世界 多线程 多进程在服务器并发中 起到举足轻重的作用 随着互联网的快速发展 你逐渐遇到了 C10K
  • aviator表达式教程

    Aviator是一个轻量级 高性能的Java表达式执行引擎 它动态地将表达式编译成字节码并运行 特性包括 支持绝大多数运算操作符 包括算术操作符 关系运算符 逻辑操作符 位运算符 正则匹配操作符 三元表达式 支持操作符优先级和括号强制设定优