Skip to content

Java 表达式语言

MVEL 解析器

MVEL(MVFLEX Expression Language)是一个轻量级且高性能的表达式语言解析器,广泛用于 Java 应用程序中。它支持丰富的语法和功能,包括变量赋值、条件判断、循环、函数调用等。以下是一些常见的 MVEL 表达式示例及其用法。

安装 MVEL

xml
<dependency>
    <groupId>org.mvel</groupId>
    <artifactId>mvel2</artifactId>
    <version>2.5.2.Final</version>
</dependency>

基本用法

1. 评估简单的表达式

java
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. 使用变量

java
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. 条件判断

xml
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. 循环

java
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. 函数调用

xml
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 使用动态类型。

java
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. 编译表达式

编译表达式可以提高性能,特别是在多次评估同一表达式时。

java
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
    }
}

高级用法

  1. 使用中文名称定义表达式,该场景特别适合计算Excel中的数据,直接使用列表作为变量。
java
 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
最近更新