• MVEL2.0的使用实例(一)


    本文是对java整合mvel2.0的一点示例:

    如果表达式中有变量,解析表达式时必须传一个map

    MVEL.eval(expression, vars);
    /**
    * 基本解析表达式
    */
    @Test
    public void test(){
    String expression ="foobar > 99";
    Map vars = new HashMap();
    vars.put("foobar",new Integer(100));
    // We know this expressionshould return a boolean.
    Boolean result = (Boolean) MVEL.eval(expression, vars);
    if (result.booleanValue()) {
    System.out.println("Itworks!");
    }
    }

    /**
    * 变量判空
    */
    @Test
    public void test4(){
    String expression = "a == empty && b == empty";

    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("a", "");
    paramMap.put("b", null);
    Object object = MVEL.eval(expression, paramMap);
    System.out.println(object); // true
    }

       /**
    *
    */
    @Test
    public void test(){
    HashMap<Object, Object> srcMap = new HashMap<>();
    srcMap.put("name","zs");
    srcMap.put("age",10);
    srcMap.put("sex","女");
    //字段映射关系
    HashMap<String, String> mapping = new HashMap<>();
    mapping.put("name","name");
    mapping.put("age","age");
    //这里先把当前年份写死为2019
    mapping.put("birthYear","2019-age");
    //目标对象
    HashMap<Object, Object> targetMap = new HashMap<>();
    //k为目标表字段,v为转换规则
    mapping.forEach((k,v)->{
    Object reValue = MVEL.eval(v,srcMap);
    System.out.println(v+":"+reValue);
    targetMap.put(k,reValue);
    });
    System.out.println("源对象"+srcMap); //源对象{sex=女, name=zs, age=10}
    System.out.println("目标对象"+targetMap); //目标对象{birthYear=2009, name=zs, age=10}
    }
    /**
    * 获取对象属性
    */
    @Test
    public void test2(){
    UserInfo user = new UserInfo();
    user.setUserName("1234");
    String expression = "user.userName = '123'";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("user",user);
    Object object = MVEL.eval(expression, paramMap);
    System.out.println(object); // true
    }
     /**
    * 多语句分号隔开 返回值无需 return
    */
    @Test
    public void test3(){
    String expression = " a = 10; b = (a = a * 2) + 10;b;";

      Map<String, Object> paramMap = new HashMap<>();
    //即便map没有任何内容 ,也需要传map 不然会报错
            Object object = MVEL.eval(expression,paramMap );
            System.out.println(object); // true
    }[
    /**
    * null 和nil 都表示空
    */
    @Test
    public void test4(){
    String expression = "a == null && b == nil";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("a", null);
    paramMap.put("b", null);
    Object object = MVEL.eval(expression, paramMap);
    System.out.println(object); // true
    }
    /**
    * 两种解析表达式方式
    */
    @Test
    public void test5(){
    UserInfo foo = new UserInfo();
    foo.setUserName("test");
    Map context = new HashMap();
    String expression = "foo.userName == 'test'";
    VariableResolverFactory functionFactory = new MapVariableResolverFactory(context);
    context.put("foo",foo);
    Boolean result = (Boolean) MVEL.eval(expression,functionFactory);
    System.out.println(result);

    Serializable compileExpression = MVEL.compileExpression(expression);
    result = (Boolean) MVEL.executeExpression(compileExpression, context, functionFactory);
    System.out.print(result);
    }
    /**
    *基本表达式计算,map工厂
    */
    @Test
    public void test3(){
    UserInfo userInfo = new UserInfo();
    String exp = "a + b > c";
    Map varsMap = new HashMap();
    varsMap.put("a", 1); varsMap.put("b", 2);varsMap.put("c", 2);
    VariableResolverFactory factory = new MapVariableResolverFactory(varsMap);
    Object eval = MVEL.eval(exp, factory);
    System.out.println(eval);
    }

    /**
    *空安全运算符user.?parent.name
    */
    @Test
    public void test4(){
    UserInfo user = new UserInfo();
    user.setUserName("xm");
    user.setPassword("123");
    user.setParent(new Parent("xmfather"));
    //user 有一个parent对象属性 parent属性中有一个name属性
    String exp = "user.?parent.name";
    Map<String,Object> factory = new HashMap<>();
    factory.put("user",user);
    // VariableResolverFactory factory = new MapVariableResolverFactory();
    Object eval = MVEL.eval(exp, factory);
    System.out.println(eval);
    }

    /**
    * 集合遍历
    */
    @Test
    public void test5(){
    List<Integer> list = new ArrayList<>();
    Map<String,Object> map = new HashMap<>();
    Map<String,Object> map2 = new HashMap<>();
    list.add(0);
    list.add(1);
    list.add(2);
    String exp = "list[0]";
    String exp2 = "map2.list";
    map2.put("list",list);
    map.put("list",list);
    map.put("map2",map2);
    Object eval = MVEL.eval(exp2,map);
    System.out.println(eval);
    }
    /**
    * Strings as Arrays
    */
    @Test
    public void test6(){
    String foo = "My String";
    String exp = "foo[0]";
    Map<String,Object> map = new HashMap<>();
    map.put("foo",foo);
    Object eval = MVEL.eval(exp,map);
    System.out.println(eval);
    }

    /**
    * If-Then-Else
    */
    @Test
    public void test7(){
    String exp = " " +
    "if (a > 0) { " +
    " System.out.println("Greater than zero!"); " +
    "} " +
    "else if (a == -1) { " +
    " System.out.println("Minus one!"); " +
    "} " +
    "else { " +
    " System.out.println("Something else!"); " +
    "} ";
    Map<String,Object> map = new HashMap<>();
    map.put("a",1);
    Object eval = MVEL.eval(exp,map);
    }  
    /**
    * 三元声明
    */
    @Test
    public void test9(){
    String expression = "num > 0 ? "Yes" : "No";";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("num", 2);
    Object object = MVEL.eval(expression, paramMap);
    System.out.println(object);
    }
    /**
    * Foreach 它接受由冒号分隔的两个参数,第一个是当前元素的局部变量,
    * 第二个是要迭代的集合或数组。
    */
    @Test
    public void test10(){

    List<String> people = new ArrayList<>();
    people.add("name");
    people.add("xm");
    people.add("xl");
    String expression = "count = 0; " +
    "foreach (name : people) { " +
    " count++; " +
    " System.out.println("Person #" + count + ":" + name); " +
    "}";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("people", people);
    Object object = MVEL.eval(expression, paramMap);
    System.out.println(object);

    String exp2 = "str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; " +
    " " +
    "foreach (el : str) { " +
    " System.out.print("["+ el + "]"); " +
    "}";
    MVEL.eval(exp2,paramMap);



    }

    /**
    * MVEL 2.0,使用for关键字简单地简化foreach
    */
    @Test
    public void test10_2(){
    String expression ="['Jim','Bob','Tom']";
    List<String> l =(List<String>) MVEL.eval(expression);
    for(String str:l){
    System.out.println(str);
    }

    String exp = "count = 0; " +
    "for (name : l) { " +
    " count++; " +
    " System.out.println("l #" + count + ":" + name); " +
    "}";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("l",l);
    MVEL.eval(exp,paramMap);
    }
      /**
    *MVEL对列表、数组、map的操作
    */
    @Test
    public void test11(){
    //list
    String expression ="['Jim','Bob','Tom']";
    List<String> l =(List<String>) MVEL.eval(expression);
    for(String str:l){
    System.out.println("list"+str);
    }

    //数组
    String exp2 = "{'Jim','Bob','Tom'}";
    Object str = MVEL.eval(exp2);
    if(str.getClass().isArray()){
    System.out.println("array"+String.valueOf(Array.get(str, 0)));
    }

    //map
    String exp3 ="['Bob' : new com.demo.po.UserInfo('Bob'), 'Michael' : new com.demo.po.UserInfo('Michael')]";
    Map o = (Map ) MVEL.eval(exp3);
    UserInfo u = (UserInfo) o.get("Bob");
    System.out.println("map"+u.getUserName());

    }

    /**
    * Do While
    */
    @Test
    public void test12(){
    String exp3 = "do { " +
    " System.out.println("当符合while中条件就执行:"+x); " +
    " --x } " +
    "while (x >= 5 );";
    Map<String,Object> map = new HashMap<>();
    map.put("x",10);
    MVEL.eval(exp3,map);

    }
    /**
    * Do Until
    */
    @Test
    public void test13(){
    String exp3 = "do { " +
    " System.out.println("当不符合while中条件就执行:"+x); " +
    " --x } " +
    "until (x < 5 );";
    Map<String,Object> map = new HashMap<>();
    map.put("x",10);
    MVEL.eval(exp3,map);}

    }
    /**
    * while
    */
    @Test
    public void test(){
    String exp3 = "while(x >= 5){" +
    "System.out.println("当符合while中条件就执行:"+x);" +
    "--x}";
    Map<String,Object> map = new HashMap<>();
    map.put("x",10);
    MVEL.eval(exp3,map);
    }


    /**
    * until
    */
    @Test
    public void test2(){
    String exp3 = "until(x < 5){" +
    "System.out.println("当不符合while中条件就执行:"+x);" +
    "--x}";
    Map<String,Object> map = new HashMap<>();
    map.put("x",10);
    MVEL.eval(exp3,map);
    }
    /**
    * 投影1.0
    */
    @Test
    public void test3(){
    List<UserInfo> users = new ArrayList<>();
    users.add(new UserInfo("xm"));
    users.add(new UserInfo("xh"));
    users.add(new UserInfo("xl"));
    String exp3 = "parentNames = (userName in users); parentNames;" ;
    Map<String,Object> map = new HashMap<>();
    map.put("users",users);
    List<UserInfo> eval = (List<UserInfo>) MVEL.eval(exp3, map);
    System.out.println(eval);
    }
    /**
    *投影2.0
    */
    @Test
    public void test3_2(){
    List<UserInfo> users = new ArrayList<>();
    users.add(new UserInfo(new Parent("xm")));
    users.add(new UserInfo(new Parent("xh")));
    users.add(new UserInfo(new Parent("xl")));
    // String exp3 = "foo=(name in (parent in users));foo" ;
    String exp3 = "foo=(parent.name in users);foo" ;
    Map<String,Object> map = new HashMap<>();
    map.put("users",users);
    List<UserInfo> eval = (List<UserInfo>) MVEL.eval(exp3, map);
    System.out.println(eval);
    }

    /**
    *投影3.0过滤投影
    */
    @Test
    public void test3_3(){
    List<UserInfo> users = new ArrayList<>();
    List<UserInfo> fams = new ArrayList<>();
    users.add(new UserInfo("xm",fams));
    users.add(new UserInfo("xh",fams));
    users.add(new UserInfo("xl",fams));
    String exp3 = "($ in users if $.userName contains 'h');" ;
    Map<String,Object> map = new HashMap<>();
    map.put("users",users);
    Object eval = MVEL.eval(exp3, map);
    System.out.println(eval);
    }
    /**
    * 过滤投影2.0
    */
    @Test
    public void test4(){
    String exp3 = "(($ < 10) in [2,4,8,16,32]); " ;
    String exp4 = "($ in [2,4,8,16,32] if $ < 10); "; // returns [2,4,8]
    Object eval = MVEL.eval(exp3);
    System.out.println(eval);
    Object eval2 = MVEL.eval(exp4);
    System.out.println(eval2);
    }
    /**
    * 导入调用简单hello函数
    */
    @Test
    public void test()throws IOException {
    File scriptFile = new File("src/main/resources/mvel/hello.el");
    Map map = new HashMap();
    map.put("name", "小明");
    MVEL. evalFile(scriptFile, ParserContext.create(), map);
    Object obj = MVEL. eval("hello(name);", map);
    }

    //hello.el的内容
    def hello(String name){
    System.out.println("hello" + name);
    }
    /**
    * Lambda(匿名函数)
    */
    @Test
    public void test2(){
    String exp = "threshold = def (x) { x >= 10 ? x : 0 }; " +
    "result = threshold(num); " +
    "System.out.println(result);";
    Map map = new HashMap();
    map.put("num",15);
    MVEL. eval(exp,map);
    }


    目前拦截器,闭包,交集,类型转换以及使用格式还有些问题没研究透


  • 相关阅读:
    angular js模块,angular js控制器
    select ipnut双向数据绑定用法
    ng-repeat循环遍历的用法
    angular js起步
    文件上传(预览2 老师提供的方法)
    设置mui头部(头部与最上面可以设置同样的样子)支持ios (苹果) 安卓不支持
    点击按钮btn 打开(跳转)新的页面
    定位精准 并打印出来
    把原始坐标转化为百度坐标(位置更精确)
    原始地理定位
  • 原文地址:https://www.cnblogs.com/cg14/p/11870882.html
Copyright © 2020-2023  润新知