210624-QlExpress使用姿势二:基本语法

文章目录
  1. 1. 四则运算
  2. 2. in操作符
  3. 3. == 与 !=
  4. 4. like 语法
  5. 5. 三元表达式
  6. 6. 自增、自减
  7. 7. 逻辑与或
  8. 8. 容器遍历
  9. 9. if、then、else
  10. 10. List/Map创建
  11. 11. 对象访问
  12. 12. 变量
  • II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注
  • 上一篇博文简单的介绍了一下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 {
    // 四则运算
    // 1 + 2 * 3 + 5 % 2 + 5 / 2 = 10
    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"));

    输出结果如下:

    1
    +abc912

    2. in操作符

    QlExpress提供了in的操作符扩展支持,后续会介绍如何实现自定义的Operator

    in主要作用用于判断元素是否在列表中

    1
    2
    3
    4
    5
    // in,判断是否在列表中
    // a = 1, d = 5
    // list = [1,2,3,4]
    System.out.println("in:" + process("a in list"));
    System.out.println("in:" + process("d in list"));

    上面执行输出

    1
    2
    in:true
    in:false

    上面的case中,列表内容为数字,a,d也是数字,那么如果有一个变量 sa = "1"会怎样?

    1
    2
    context.put("sa", "1");
    System.out.println("sa in:" + process("sa in list"));

    输出同样是true

    1
    sa in: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
    // like 语法
    context.put("name", "一灰灰");
    System.out.println("like:" + process("name like '%灰'"));

    输出

    1
    like:true

    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"));

    输出

    1
    2
    自增:2
    自减:1

    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
    // 遍历, 不支持forearch,需要改为原生的for循环
    // 大括号需要有,不然会抛异常
    System.out.println("遍历:" +
    process("sum = 0; for(i = 0; i < list.size(); i++) {sum = sum+list.get(i);} return sum;"));


    // map 遍历方式,keySet转array,然后再for循环迭代
    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
    // 创建List
    express = "abc = NewList(1,2,3); return abc.get(1)+abc.get(2)";
    System.out.println("创建List:" + process(express));

    // 创建Map
    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
    // 输出10
    System.out.println(process("int tmp = 10;"));
    // 输出null
    System.out.println(context.get("tmp"));
    // 输出10
    System.out.println(process("tmp = 10;"));
    // 输出10
    System.out.println(context.get("tmp"));

    II. 其他

    1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

    一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    2. 声明

    尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

    3. 扫描关注

    一灰灰blog

    QrCode

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×