上一篇博文简单的介绍了一下QlExpress,以及一个最基础的使用demo,接下来我们看一下QlExpress的语法,重点关注一下它与Java不同的地方
1. 四则运算
对于加减乘除,求余等操作与java基本一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class SimpleUsageDemo { private static ExpressRunner runner = new ExpressRunner(); private static DefaultContext<String, Object> context = new DefaultContext<>();
static { context.put("a", 1); context.put("b", 2); context.put("c", 3); context.put("d", 5); context.put("list", Arrays.asList(1, 2, 3, 4)); }
private static Object process(String express) throws Exception { return runner.execute(express, context, null, true, false); }
public static void main(String[] args) throws Exception { String express = "a + b * c + d % 2 + d / 2"; System.out.println("四则计算:" + process(express)); } }
|
上面是正常的数字运算,如果有变量不是数值,而是String,会怎样?
1 2 3 4
| context.put("s1", "abc"); context.put("s2", 456);
System.out.println("+" + process("s1 + s2 * 2"));
|
输出结果如下:
2. in操作符
QlExpress提供了in的操作符扩展支持,后续会介绍如何实现自定义的Operator
in主要作用用于判断元素是否在列表中
1 2 3 4 5
|
System.out.println("in:" + process("a in list")); System.out.println("in:" + process("d in list"));
|
上面执行输出
上面的case中,列表内容为数字,a,d也是数字,那么如果有一个变量 sa = "1"
会怎样?
1 2
| context.put("sa", "1"); System.out.println("sa in:" + process("sa in list"));
|
输出同样是true
主要原因在 OperatorIn#executeInner
的实现里面,核心代码如下(下一节讲==
的时候说)
3. == 与 !=
1 2 3 4
| System.out.println("a == 1:" + process("a == 1")); System.out.println("b == '2':" + process("b == \"2\"")); System.out.println("b != '2':" + process("b != \"2\""));
|
注意输出
1 2 3
| a == 1:true b == '2':true b != '2':false
|
注意,qlExpress中,==与java中的不一样,它更多的是值比较,主要是方法 Operator#compareData()
(也是上面in的判断依据)来实现的
注意
从上面的截图也可以看出,在QlExpress中的比较符号,只支持部分类型
- 一个为String,另外一个专为String进行比较
- 两个都是数值类型
- 两个都是Boolean类型
- 两个都是日期Date类型
- 不满足上面条件的比较,抛异常
4. like 语法
和sql的like语句差不多,属于新增特性
1 2 3
| context.put("name", "一灰灰"); System.out.println("like:" + process("name like '%灰'"));
|
输出
5. 三元表达式
这个就是java中的?:
,没有什么去呗
1
| System.out.println("三元表达式:" + process("a == 1? '1': '2'"));
|
6. 自增、自减
++/--
,需要注意的是QlExpress中,只支持后置的
1 2
| System.out.println("自增:" + process("a++; a")); System.out.println("自减:" + process("a--; a"));
|
输出
7. 逻辑与或
&&||
与java没有什么区别
1 2 3
| // 逻辑与或 System.out.println("&&:" + process("a == 1 && b == 2")); System.out.println("||:" + process("a == 2 || b == 1"));
|
8. 容器遍历
注意,QlExpress不支持foreach
,只支持最原始的for循环,其次大括号必须有,不能省略
1 2 3 4 5 6 7 8 9 10 11 12 13
|
System.out.println("遍历:" + process("sum = 0; for(i = 0; i < list.size(); i++) {sum = sum+list.get(i);} return sum;"));
Map<String, Object> map = new HashMap<>(); map.put("a", 10); map.put("b", 20); context.put("map", map); System.out.println("遍历:" + process("sum=0; keySet=map.keySet().toArray(); for(i = 0; i < keySet.length; i++) {sum = sum + map.get(keySet[i]);} return sum"));
|
9. if、then、else
支持标准的if语句,也支持if/then/else
1 2 3
| System.out.println(process("if(a == 1) then a = 10 else a= 30; a "));
System.out.println(process("if(true) { println('hello');} else { println('world'); }"))
|
10. List/Map创建
弱类型语言,请不要定义类型声明, 更不要用Templete(Map<String,List>之类的)
提供NewList, NewMap来实现快速的列表,Map创建
1 2 3 4 5 6 7
| express = "abc = NewList(1,2,3); return abc.get(1)+abc.get(2)"; System.out.println("创建List:" + process(express));
express = "abc = NewMap(1:1,2:2); return abc.get(1) + abc.get(2);"; System.out.println("创建Map:" + process(express));
|
11. 对象访问
对象的成员属性可以直接访问,几遍它是私有的,也没有关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class BasicDemo { private String name; private Integer age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; } }
BasicDemo user = new BasicDemo(); user.setName("一灰"); user.setAge(18); context.put("user", user); System.out.println("user.name:" + process("user.name"));
|
12. 变量
在QlExpress的表达式中,声明局部变量时,需要在前面添加类型;若不添加类型,那么这个变量会放到上下文中
1 2 3 4 5 6 7 8
| System.out.println(process("int tmp = 10;"));
System.out.println(context.get("tmp"));
System.out.println(process("tmp = 10;"));
System.out.println(context.get("tmp"));
|
II. 其他
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注
一灰灰blog