DongweimaAviator


title: Aviator
date: 2019-02-17
categories:

- 框架

toc: true
tags:

- 表达式引擎
- 节点路由

description: 最近遇到节点路由的需求,调研了一下,采用 Aviator 解决,记录一下.

本文均为摘录

github 地址
https://github.com/killme2008/aviator
具体文档地址
https://github.com/killme2008/aviator/wiki

依赖

1
2
3
4
5
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>{version}</version>
</dependency>

使用变量

1
2
3
Map<String, Object> env = new HashMap<String, Object>();
env.put("yourName", yourName);
String result = (String) AviatorEvaluator.execute(" 'hello ' + yourName ", env);

调用函数(内置函数)

1
Aviator 支持函数调用, 函数调用的风格类似 lua

lambda函数定义

aviator 支持通过 lambda 关键字定义一个匿名函数,并且支持闭包捕获
匿名函数的基本定义形式是

1
lambda (参数1,参数2...) -> 参数体表达式 end

1
2
3
4
AviatorEvaluator.exec("(lambda (x,y) -> x + y end)(x,y)", 1, 2);

AviatorEvaluator
.exec("(lambda (x) -> lambda(y) -> lambda(z) -> x + y + z end end end)(1)(2)(3)");

自定义函数

Aviator 除了内置的函数之外,还允许用户自定义函数,只要实现com.googlecode.aviator.runtime.type.AviatorFunction接口, 并注册到AviatorEvaluator即可使用. AviatorFunction接口十分庞大, 通常来说你并不需要实现所有的方法, 只要根据你的方法的参 数个数, 继承AbstractFunction类并override相应方法即可。

编译表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestAviator {
public static void main(String[] args) {
String expression = "a-(b-c)>100";
// 编译表达式
Expression compiledExp = AviatorEvaluator.compile(expression);
Map<String, Object> env = new HashMap<String, Object>();
env.put("a", 100.3);
env.put("b", 45);
env.put("c", -199.100);
// 执行表达式
Boolean result = (Boolean) compiledExp.execute(env);
System.out.println(result); // false
}
}

访问数组和集合

可以通过中括号去访问数组和java.util.List对象, 可以通过map.key访问java.util.Map中key对应的value

nil 对象

日期比较

不支持

强大的 seq 库

aviator 拥有强大的操作集合和数组的 seq 库。整个库风格类似函数式编程中的高阶函数。在 aviator 中, 数组以及java.util.Collection下的子类都称为seq,可以直接利用 seq 库进行遍历、过滤和聚合等操作。