清华主页 - 清华新闻 - 综合时讯 - 正文

AVIATOR——轻量级JAVA表达式求值引擎

目录。

一:简介。

二:特性。

三: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的限制。

  • 没有if else、do 像while这样的句子没有赋值句󿀌只支持逻辑表达式、算术表达式、三元表达式和正则匹配。

  • 不支持八进制数字面量࿼只支持十进制和十六进制的数字面量。

四:详细见官网 。

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  }。

2025-06-24 12:31:55

相关新闻

清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.