目录。
一:简介。
二:特性。
三:Aviator的限制。
四:详细见官网 。
五:案例大全。
案例一。
案例二。
案例三。
案例四 。
案例五。
案例六。
案例七。
一:简介。
Aviator是高性能、轻量级java语言的表达式求值引擎,主要用于各种表达式的动态求值。java表达式求值引擎已经有很多开源可用c;为什么需要Avaitor?f;
Aviator的设计目标是*轻量级*和*高性能 。,与Grovy相比、JRuby的笨重,非常小的Aviator༌另外,依赖包只有450K,不是依赖包,只有70K;当然,Aviator的语法有限,它不是一门完整的语言,只是语言的一小部分集合。
二是,Aviator的实现思路与其他轻量级求值器非常不同,其他求值器通常通过解释运行,而Aviator则直接将表达式*编译成Java字节码。,交给JVM执行。简单来说,,Aviator的定位介于Groovy等重量级脚本语言与IKExpresion等轻量级表达式引擎之间。
二:特性。
Aviator的特点。
支持大部分操作符包括算术操作符、关系操作符、逻辑操作符、位置操作符、正则匹配操作符(=~)、三元表达式三元表达式三元表达式?: ,并支持操作符的优先级和括号强制优先级,请参见以下操作符列表。
支持大整数和精度运算(2.3.#xff090版本介绍
支持函数调用和自定义函数。
内置支持正则表达式匹配,类似Ruby、Perl匹配语法,$digit指向匹配分组,支持类Ruby。
#xfff0自动类型转换c;当执行操作时,操作数类型将自动判断,并进行相应的转换,不能转换即抛异常。
支持传输变量支持类似a.b.c嵌套变量访问。
函数式seq库,操作集合和数组。
性能优秀。
三:Aviator的限制。
四:详细见官网 。
AviatorScript 编程指南(5.0) · 语雀。
五:案例大全。
案例一。
public static void main(String[] args) { // 表达式 String expression = "a-(b-c) > 100"; // 表达式可以通过compile编译成Expression的中间对象 Expression compiledExp = AviatorEvaluator.compile(expression,Boolean.TRUE); // compiledExp.newEnv(); 创建Map相当于赋值 Boolean result = (Boolean) compiledExp.execute(compiledExp.newEnv("a", 100.3, "b", 45, "c", -199.100)); System.out.println(result);// false }。
案例二。
public static void main(String[] args) { // 创建解释器 AviatorEvaluatorInstance engine = AviatorEvaluator.newInstance(EvalMode.INTERPRETER); // 打开跟踪执行(不建议在线打开) engine.setOption(Options.TRACE_EVAL, true); Expression exp = engine.compile("score > 80 ? 'good' : 'bad'"); System.out.println(exp.execute(exp.newEnv("score", 100)));// good System.out.println(exp.execute(exp.newEnv("score", 50)));// bad }。
案例三。
public static void main(String[] args) { Map map = MapUtil.newHashMap(); map.put("aa","美国,中国,德国,法国"); map.put("bb","中国"); // bbbbbaa的数据是否包含 Expression expression = AviatorEvaluator.compile("string.contains(aa,bb)", true); Boolean result = (Boolean) expression.execute(map); System.out.println("结果"+result);// 结果true }。
案例四 。
public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException { AviatorEvaluator.addStaticFunctions("str", CharSequenceUtil.class); Map map = MapUtil.newHashMap(); map.put("aa","美国,中国,德国,法国"); Expression expression = AviatorEvaluator.compile("str.isBlank(aa)", true); Boolean result = (Boolean) expression.execute(map); System.out.println("结果"+result);// 结果false }。
案例五。
public static void main(String[] args) { // site和receivecountry可以先占据 String expression = "string.contains('A,B,C',site) && string.contains('AA,AC,CC,DD',receiveCountry)"; // 编译表达式 Expression compiledExp = AviatorEvaluator.compile(expression); Map env = new HashMap<>(); env.put("site", "A"); env.put("receiveCountry", "AA"); // 执行表达式 System.out.println( compiledExp.execute(env));// true }。
案例六。
public class MoreStrFunction extends AbstractFunction { @Override public AviatorBoolean call(Map env, AviatorObject arg1, AviatorObject arg2) { // 解析到“helllo-word” String original = FunctionUtils.getStringValue(arg1, env); // 分析word String param = FunctionUtils.getStringValue(arg2, env); if (CharSequenceUtil.isBlank(param)){ return AviatorBoolean.valueOf(Boolean.FALSE); } List originals= CharSequenceUtil.split(original, StrPool.COMMA); List params= CharSequenceUtil.split(param, StrPool.COMMA); return AviatorBoolean.valueOf(originals.containsAll(params)); } @Override public String getName() { return "moreStrCompare"; }}public static void main(String[] args) { String expression="moreStrCompare('hello-word',str)"; AviatorEvaluator.addFunction(new MoreStrFunction()); Expression compiledExp = AviatorEvaluator.compile(expression); //匹配 Map env = new HashMap<>(); env.put("str", "word"); System.out.println(compiledExp.execute(env));// false }。
案例七。
public static void main(String[] args) { String expression="moreStrCompare('hello',site) && string.contains('us,um',receiveCountry) && weight>=0.01 && weight<=4.0 && moreStrCompare('测试',orderTag) && string.contains('1001',id) "; AviatorEvaluator.addFunction(new MoreStrFunction()); Expression compiledExp = AviatorEvaluator.compile(expression,true); Map ruleBO=JSONUtil.toBean("{ \"id\":3913695,\"site\":\"aaa\",\"receiveCountryIos\":\"aa\",\"receiveProvince\":\"aa\",\"postcode\":\"aa\",\"weight\":0.99," + "\"orderTag\":\"\",\"skuCode\":\"a,b\",\"spuId\":\"1,2,3,4,5\&34;,\"transportType\":\"aaa\",\"orderAmount\":152.75}", Map.class); //匹配 System.out.println(compiledExp.execute(ruleBO));//false }。