当前位置: 首页 > 工具软件 > MVEL > 使用案例 >

java mvel_MVEL2.0的使用实例(一)

步德宇
2023-12-01

本文是对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 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 srcMap = new HashMap<>();

srcMap.put("name","zs");

srcMap.put("age",10);

srcMap.put("sex","女");

//字段映射关系

HashMap mapping = new HashMap<>();

mapping.put("name","name");

mapping.put("age","age");

//这里先把当前年份写死为2019

mapping.put("birthYear","2019-age");

//目标对象

HashMap 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 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 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 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 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 list = new ArrayList<>();

Map map = new HashMap<>();

Map 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 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 = "\n" +

"if (a > 0) {\n" +

" System.out.println(\"Greater than zero!\");\n" +

"}\n" +

"else if (a == -1) { \n" +

" System.out.println(\"Minus one!\");\n" +

"}\n" +

"else { \n" +

" System.out.println(\"Something else!\");\n" +

"}\n";

Map map = new HashMap<>();

map.put("a",1);

Object eval = MVEL.eval(exp,map);

}

/**

* 三元声明

*/

@Test

public void test9(){

String expression = "num > 0 ? \"Yes\" : \"No\";";

Map paramMap = new HashMap<>();

paramMap.put("num", 2);

Object object = MVEL.eval(expression, paramMap);

System.out.println(object);

}

/**

* Foreach 它接受由冒号分隔的两个参数,第一个是当前元素的局部变量,

* 第二个是要迭代的集合或数组。

*/

@Test

public void test10(){

List people = new ArrayList<>();

people.add("name");

people.add("xm");

people.add("xl");

String expression = "count = 0;\n" +

"foreach (name : people) {\n" +

" count++;\n" +

" System.out.println(\"Person #\" + count + \":\" + name);\n" +

"}";

Map paramMap = new HashMap<>();

paramMap.put("people", people);

Object object = MVEL.eval(expression, paramMap);

System.out.println(object);

String exp2 = "str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n" +

" \n" +

"foreach (el : str) {\n" +

" System.out.print(\"[\"+ el + \"]\"); \n" +

"}";

MVEL.eval(exp2,paramMap);

}

/**

* MVEL 2.0,使用for关键字简单地简化foreach

*/

@Test

public void test10_2(){

String expression ="['Jim','Bob','Tom']";

List l =(List) MVEL.eval(expression);

for(String str:l){

System.out.println(str);

}

String exp = "count = 0;\n" +

"for (name : l) {\n" +

" count++;\n" +

" System.out.println(\"l #\" + count + \":\" + name);\n" +

"}";

Map paramMap = new HashMap<>();

paramMap.put("l",l);

MVEL.eval(exp,paramMap);

}

/**

*MVEL对列表、数组、map的操作

*/

@Test

public void test11(){

//list

String expression ="['Jim','Bob','Tom']";

List l =(List) 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 { \n" +

" System.out.println(\"当符合while中条件就执行:\"+x);\n" +

" --x } \n" +

"while (x >= 5 );";

Map map = new HashMap<>();

map.put("x",10);

MVEL.eval(exp3,map);

}

/**

* Do Until

*/

@Test

public void test13(){

String exp3 = "do { \n" +

" System.out.println(\"当不符合while中条件就执行:\"+x);\n" +

" --x } \n" +

"until (x < 5 );";

Map 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 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 map = new HashMap<>();

map.put("x",10);

MVEL.eval(exp3,map);

}

/**

* 投影1.0

*/

@Test

public void test3(){

List 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 map = new HashMap<>();

map.put("users",users);

List eval = (List) MVEL.eval(exp3, map);

System.out.println(eval);

}

/**

*投影2.0

*/

@Test

public void test3_2(){

List 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 map = new HashMap<>();

map.put("users",users);

List eval = (List) MVEL.eval(exp3, map);

System.out.println(eval);

}

/**

*投影3.0过滤投影

*/

@Test

public void test3_3(){

List users = new ArrayList<>();

List 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 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 };\n" +

"result = threshold(num);\n" +

"System.out.println(result);";

Map map = new HashMap();

map.put("num",15);

MVEL. eval(exp,map);

}

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

 类似资料: