1、使用Aviator 需要導入包
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.3.0</version>
</dependency>
2、執行表達式
Aviator的數值類型僅支持Long和Double, 任何整數都將轉換成Long, 任何浮點數都將轉換爲Double, 包括用戶傳入的變量數值
Long result = (Long) AviatorEvaluator.execute("22+1+100");
System.out.println(result);//123
3、變量使用
Aviator的String是任何用單引號或者雙引號括起來的字符序列
String myname = "Lily";
Map<String,Object> map = new HashMap<String,Object>();
map.put("myname",myname);
//方法一:
String result1 = (String) AviatorEvaluator.execute(" 'hello '+ myname",map);
System.out.println(result1);
//方法二:
Object result11 = AviatorEvaluator.exec("'hello '+ myname",myname);
System.out.println(result11.toString());
String result2 = (String) AviatorEvaluator.execute("\"a\'b\'c\"");//輸出:a'b'c
String result3 = (String) AviatorEvaluator.execute("'a\"b\"c'");//輸出:a"b"c
String result4 = (String) AviatorEvaluator.execute("'a\"b\"c' + 3");//輸出:a"b"c3
String result5 = (String) AviatorEvaluator.execute("'a\"b\"c' + hello");//輸出:a"b"cnull
4、函數使用
通過string.substring('habcello', 1, 3)獲取字符串'ab', 然後通過函數string.contains判斷e是否在'abc'中。
System.out.println(AviatorEvaluator.execute("string.substring('habcello',1,3)"));//ab
System.out.println(AviatorEvaluator.execute("string.contains(\"abc\",\"ab\")"));//true
System.out.println(AviatorEvaluator.execute("string.contains(\"abc\",string.substring('habcello',1,3))"));
System.out.println(AviatorEvaluator.execute("string_to_date('2018-09-11',\"yyyymmdd\")"));//Tue Jan 09 00:00:00 CST 2018
System.out.println(AviatorEvaluator.exec("date_to_string(dd,\"yyyy-mm-dd\")",new Date()));//2017-18-30
5、自定義函數
public class AviatorUtil extends AbstractFunction {
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
Number num1 = FunctionUtils.getNumberValue(arg1,env);
Number num2 = FunctionUtils.getNumberValue(arg2,env);
//乘法
AviatorObject o = new AviatorDouble(num1.doubleValue() * num2.doubleValue());
return o;
}
public String getName() {
return "multiplication";
}
}
測試類:
public static void main(String[] args) {
AviatorEvaluator.addFunction(new AviatorUtil());
System.out.println(AviatorEvaluator.execute("multiplication(5,4)"));//輸出:20
System.out.println(AviatorEvaluator.execute("multiplication(10,multiplication(5,4))"));//輸出:200
}
6、編譯表達式
通過compile方法可以將表達式編譯成Expression的中間對象,
當要執行表達式的時候傳入map1並調用Expression的execute方法即可
String expression = "a/(b+c)>10";
Expression exp = AviatorEvaluator.compile(expression);
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("a",100);
map1.put("b",0);
map1.put("c",5);
Boolean bool = (Boolean) exp.execute(map1);
System.out.println(bool);//true
7、訪問數組和集合
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
int[] nums = new int[5];
for(int i=0;i<nums.length;i++){
nums[i]=i;
}
Map<String,Object> map2 = new HashMap<String,Object>();
// map2.put("date",DateUtils.date2Str(new Date(),DateUtils.DATE_FORMAT_SEC));
map2.put("date",AviatorEvaluator.exec("date_to_string(dd,\"yyyy-mm-dd\")",new Date()));
System.out.println(AviatorEvaluator.execute("string_to_date('2018-09-11',\"yyyymmdd\")"));//Tue Jan 09 00:00:00 CST 2018
System.out.println(AviatorEvaluator.exec("date_to_string(dd,\"yyyy-mm-dd\")",new Date()));//2017-18-30
// map2.put("date1", "dd");
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("list",list);
map3.put("nums",nums);
map3.put("map2",map2);
System.out.println(AviatorEvaluator.execute("list[0]+' '+list[1]",map3));//hello world
System.out.println(AviatorEvaluator.execute("'nums[0]+nums[1]+nums[2]='+(nums[0]+nums[1]+nums[2])",map3));//nums[0]+nums[1]+nums[2]=3
System.out.println(AviatorEvaluator.execute("'當前時間爲:'+map2.date",map3));//當前時間爲:2017-12-30 19:56:42
}