概述
MVEL是从英文翻译而来的,MVFLEX表达式语言是Java平台的动态/静态混合类型的运行时可嵌入表达式语言。该项目最初是作为应用程序框架的实用语言开始的,现在已完全独立开发。MVEL通常用于通过XML文件或注释等配置将基本逻辑公开给最终用户和程序员。它也可以用来解析简单的JavaBean表达式。
在一些项目中我们需要对一些场景进行过滤并允许用户配置的时候,通常会采用MVEL表达式,比如:指定条件下更新数据;指定条件下采集数据等。
相关文章
🔥 Java解析执行MVEL表达式
基本语法部分
简单属性表达
下面是最简单的属性表达,他表示了从当时场景的上下文中获取一个student对象的name属性值,属性表达式是最常见的用途之一,允许 MVEL 用作性能非常高、易于使用、反射优化器。
student.name
当然,我们还可以对它进行比较等操作,和Java代码类似:
student.name == 'ZhangSan'
上面的表达式将会为我们返回一个boolean类型的结果,表示比对student.name是否等于“ZhangSan” ,其实除此之外,他还支持基本的运算优先级和括号的执行顺序,比如:
(student.name == 'ZhangSan') && ((student.age * 2) + 1) > 15
多语句表达
MVEL同样支持多语句表达的形式,每一个语句最后都需要使用 “ ; ” (半角分号)进行分割。最后一句或只有一句的场景不需要分号。另外注意!不能用换行代替分号。比如:
statement1; statement2; statement3
返回值
MVEL不需要显示的 return 需要返回的内容,它将自动获取最后一个语句的结果。比如:
a = 2;
b = (a + 10) * 10;
b
以上语句将返回b的最终结果,也就是200。
值检测
判空
类似于我们在Java中的判空操作,它为我们提供了类似于 Strings.isEmpty(String s) 的操作,能够直接判断出值是否是空的。
str == empty
如果 str 是 null 或 “” 将会返回true,否则返回false
判空或零
在一些基础类型中,我们可能需要排除值为0的场景;亦或是一些需要判断等于0或null的场景,请使用: null 或 nil 。下面举例中 例1 和 例2 完全相同:
例1:
price == null;
例2:
price == nil;
自动强转性
在MVEL中,类似于一些类型不敏感的语言,它具有自动转型的能力,比如下面的语句,将会返回 true 的结果:
"123" == 123;
List / Arrays / Map 表达
Map
MVEL提供了一种非常优雅的形式表达此类内容,整体赋值的感觉和php有些许类似但又有不同。
比如表达一个Map<String, Person> 类型的数据,您可以使用下面的语句:
["ZhangSan" : new Person("ZhangSan"), "LiSi" : new Person("LiSi")]
上面的代码相当于:
Map map = new HashMap();
map.put("ZhangSan", new Person("ZhangSan"));
map.put("LiSi", new Person("LiSi"));
而且这种表达形式还可以直接作为方法的参数,比如下面语句是合法的:
someClass.someMethod(["mathTeacher" : "ZhangSan"]);
总结来说,Map的格式表示:"[键1: 值1, 键2: 值2, ...]"
List
List的表达方式是很简单,方括号中写需要的值就可以,中间使用逗号进行分割:
["apple", "banana", "orange"]
Array
值的注意的是,Array表达形式和我们的List表达并不一样,两边换成了 {} ,比如:
{"apple", "banana", "orange"}
内联数组
关于内联数组,需要了解的一个重要方面是它们可以被强制转换成其他数组类型的特殊能力。当你声明一个内联数组时,它是没有类型的,但比如说你要传递给一个接受int[]的方法。你可以简单地把你的代码写成下面这样。
someClass.someMethod({1,2,3,4});
后续
欢迎查看后续内容,将介绍属性、Java解析等内容