Aviator——轻量级表达式执行引擎
- 7. 语言 AviatorEvaluator 入口类 AviatorEvaluator.execute() AviatorEvaluator.execute(env) env为表达式中变量的值 env为Map<String,Object> AviatorEvaluator.compile(string) AviatorEvaluator.compile(string,cached) cached 是否缓存编译结果
- 8. Hello world String name= args[0]; Map<String, Object> env = new HashMap<String, Object>(); env.put(" name ", name); String result = (String) AviatorEvaluator.execute(" 'hello ' + name ", env); System.out.println(result);
- 11. 逻辑运算和关系运算 true false && true true || false 短路规则 messageType==‘trade-cteate’ && !committed !bool a>b a>=nil , 永远返回true a<b a<=nil ,返回false,除非a为nil a==b a!=nil
- 12. 三元操作符 ?: 1>0? 1:-1 bool? (a+b) : (a-b) !t? i>0? f:ch : f>3?email:ch 多层嵌套 !t? (i>0? f:ch) :( f>3?email:ch) 使用括号
- 14. 字符串运算 ‘hello’+1 == ‘hello1’ ‘hello ’ + ‘world’ == ‘hello world’ ‘hello ’ + nil == ‘hello null’ i+’hello’ == i.toString() + ‘hello’ 任何对象与String相加,结果为String ‘abc’ > ‘bac’ ‘abc’ ==‘abc’ 字符串比较可以直接使用关系运算符 date > '2009-12-20 00:00:00:00‘ 字符串可以跟java.util.Date直接比较,字符串形式必须为yyyy-MM-dd HH:mm:ss:SS
- 17. 函数调用 sysdate() rand() println(a) print(a) string.contains(‘hello’,’ell’) string.length(a) math.pow(3,2.0) math.sin(30) ……etc,目前有system、math和seq三种标准库函数
- 19. Seq库 map(s,println) map(s,-) 求相反数组成的集合 filter(s,seq.gt(3)) value>3组成的集合 filter(s,seq.exists()) 非nil组成的集合 reduce(s,+,0) 求和 reduce(s,*,1) 阶乘 include(s,’hello’)
- 20. 自定义函数 class AddFunction implements AviatorFunction 自定义函数实现AviatorFunction接口 public AviatorObject call(Map<String, Object> env, AviatorObject... args) 实际的调用操作,args为传入的参数 public String getName() 返回函数名,表达式使用该名称 AviatorEvaluator.addFunction(new AddFunction()); 注册函数 AviatorEvaluator.execute("add(1,2)")); AviatorEvaluator.execute("add(add(1,2),100)"));
- 21. 类型转换规则 Java的byte short int long都转化为Long类型,Java的float,double都将转化为Double类型。Java的char String都将转化为String。Java的null都将转为nil。 当两个操作符都是Double或者都是Long的时候,各自按照Double或者Long的类型执行 当两个操作符中某一个是Double的时候,另一个操作数也将转换成Double,按照Double类型执行。 任何类型与String相加,结果为String 任何类型都比nil大,除了nil本身。 nil在打印或者与字符串相加的时候,显示为null 形如"yyyy-MM-dd HH:mm:ss:SS"的字符串,在与java.util.Date做比较的时候将尝试转换成java.util.Date对象比较。 没有规定的类型转换操作,除了未知的变量类型之间,都将抛出异常。
- 25. i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) %
- 26. 'A' == 'A' || 'B' == 'B' && 'ABCD' == t && 'A' == 'A'