Java 表达式语言
MVEL 解析器
MVEL(MVFLEX Expression Language)是一个轻量级且高性能的表达式语言解析器,广泛用于 Java 应用程序中。它支持丰富的语法和功能,包括变量赋值、条件判断、循环、函数调用等。以下是一些常见的 MVEL 表达式示例及其用法。
安装 MVEL
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.5.2.Final</version>
</dependency>
基本用法
1. 评估简单的表达式
import org.mvel2.MVEL;
public class MVELExample {
public static void main(String[] args) {
// 定义表达式
String expression = "2 + 3 * 4";
// 评估表达式
Object result = MVEL.eval(expression);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: 14
}
}
2. 使用变量
import org.mvel2.MVEL;
import java.util.HashMap;
import java.util.Map;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
Map<String, Object> variables = new HashMap<>();
variables.put("a", 5);
variables.put("b", 10);
// 定义表达式
String expression = "a + b * 2";
// 评估表达式
Object result = MVEL.eval(expression, variables);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: 25
}
}
3. 条件判断
import org.mvel2.MVEL;
import java.util.HashMap;
import java.util.Map;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
Map<String, Object> variables = new HashMap<>();
variables.put("age", 20);
// 定义表达式
String expression = "age >= 18 ? 'Adult' : 'Minor'";
// 评估表达式
Object result = MVEL.eval(expression, variables);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: Adult
}
}
4. 循环
import org.mvel2.MVEL;
import java.util.ArrayList;
import java.util.List;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
// 定义表达式
String expression = "for (num : numbers) { sum += num; } return sum;";
// 初始化变量
Map<String, Object> variables = new HashMap<>();
variables.put("numbers", numbers);
variables.put("sum", 0);
// 评估表达式
Object result = MVEL.eval(expression, variables);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: 6
}
}
5. 函数调用
import org.mvel2.MVEL;
import java.util.HashMap;
import java.util.Map;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
Map<String, Object> variables = new HashMap<>();
variables.put("name", "Alice");
// 定义表达式
String expression = "greet(name)";
// 定义函数
Map<String, Object> functions = new HashMap<>();
functions.put("greet", (Function<String, String>) name -> "Hello, " + name);
// 评估表达式
Object result = MVEL.eval(expression, variables, functions);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: Hello, Alice
}
}
高级用法
1. 动态类型和静态类型
MVEL 支持动态类型和静态类型。默认情况下,MVEL 使用动态类型。
import org.mvel2.MVEL;
import java.util.HashMap;
import java.util.Map;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
Map<String, Object> variables = new HashMap<>();
variables.put("a", 5);
// 定义表达式
String expression = "a + 10";
// 评估表达式
Object result = MVEL.eval(expression, variables);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: 15
}
}
2. 编译表达式
编译表达式可以提高性能,特别是在多次评估同一表达式时。
import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.compiler.CompiledExpression;
import java.util.HashMap;
import java.util.Map;
public class MVELExample {
public static void main(String[] args) {
// 定义变量
Map<String, Object> variables = new HashMap<>();
variables.put("a", 5);
// 定义表达式
String expression = "a + 10";
// 创建解析上下文
ParserContext context = new ParserContext();
context.addInput("a", Integer.class);
// 编译表达式
CompiledExpression compiledExpr = MVEL.compileExpression(expression, context);
// 评估编译后的表达式
Object result = MVEL.executeExpression(compiledExpr, variables);
// 输出结果
System.out.println("Result: " + result); // 输出: Result: 15
}
}
高级用法
- 使用中文名称定义表达式,该场景特别适合计算Excel中的数据,直接使用列表作为变量。
Map<String, Object> ctx = new HashMap<>();
ctx.put("张三", 11905);
ctx.put("里斯", 12000);
String res = MVEL.eval("(张三 - 里斯) / 2 < 0 && 张三 > 11905", ctx, String.class);
System.out.println(res);
// 输出:false