java 表达式引擎概览-02-google 表达式引擎 Aviator 入门介绍
2020年5月26日大约 7 分钟
Aviator
Aviator 是一个轻量级、高性能的 Java 表达式求值器。
它可以将表达式编译为字节码,并即时执行求值。
快速入门
Jar 依赖
com.googlecode.aviator
aviator
3.3.0
HelloAviator.java
import com.googlecode.aviator.AviatorEvaluator;
import java.util.HashMap;
import java.util.Map;
public class HelloAviator {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
Map env = new HashMap<>(1);
env.put("a", a);
AviatorEvaluator.execute("1 + 2 + 3");
AviatorEvaluator.execute("a[1] + 100", env);
AviatorEvaluator.execute("'a[1]=' + a[1]", env);
//求数组长度
AviatorEvaluator.execute("count(a)", env);
//求数组总和
AviatorEvaluator.execute("reduce(a, +, 0)", env);
//检测数组每个元素都在 0 env = new HashMap<>();
env.put("env", input);
// 定义提取 IP 地址的表达式
String ip = input.split(";")[1].split("=")[1];
// 输出结果
System.out.println("提取的 IP 地址: " + ip);
}
aviator 方式
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import java.util.HashMap;
import java.util.Map;
public class AvaitarRegexDemo {
public static void main(String[] args) {
// 定义输入字符串
String input = "name=老马啸西风;ip=127.0.0.1";
// 将输入字符串放入 env 环境变量中
Map env = new HashMap<>();
env.put("env", input);
// 定义提取 IP 地址的表达式
String expression = "string.split(string.split(env, ';')[1], '=')[1]";
// 编译并执行表达式
Expression compiledExp = AviatorEvaluator.compile(expression);
String ip = (String) compiledExp.execute(env);
// 输出结果
System.out.println("提取的 IP 地址: " + ip);
}
}
正则表达式的方式
package org.example;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexFindIpDemo {
public static void main(String[] args) {
// 定义输入字符串
String input = "name=老马啸西风;ip=127.0.0.1";
// 定义正则表达式
String regex = "ip=(\\d+\\.\\d+\\.\\d+\\.\\d+)";
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 查找匹配的结果
if (matcher.find()) {
// 提取并输出 IP 地址
String ip = matcher.group(1);
System.out.println("提取的 IP 地址: " + ip);
} else {
System.out.println("未找到 IP 地址");
}
}
}
性能duibni
原生方式,10W次: 98ms
Regex 方式,
提前 pattern 优化:122ms
不提前优化,大概 200ms
- 表达式引擎方式:
缓存编译:AviatorEvaluator.compile(expression, true)
耗时 275ms
不缓存的话,性能会非常差。约 19s
如果是长文本,500+ 对比:
Regex 方式,提前 pattern 优化:407ms
表达式引擎方式 方式,cache pattern(其实不需要,提前编译好即可):169ms
贡献者
binbin.hou