Mvel表达式的基础使用和自定义方法运用

本文详细介绍了MVEL表达式解析器的使用,包括基础操作如判断和算术运算,以及如何注册并使用自定义方法。通过示例代码展示了如何将自定义方法`containsIgnCase`添加到MVEL上下文中,并执行含有该方法的表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mvel是一种易于使用、灵活且强大的表达式解析器,语法与java有些相似,功能有点像是将我们的自然语言解析为计算机语言(个人通俗理解,不准确)。

基础使用

文档:http://mvel.documentnode.com/#language-guide-for-2.0

举个最简单的例子:

要判断 5 是否大于 2,  或者计算 5减2这种算术运算, 直接用下面代码中写法即可

import org.mvel2.MVEL;
import org.mvel2.ParserContext;

import java.io.Serializable;

/**
 * Mvel测试
 *
 * @author: Danger
 */
public class MvelTest {

    public static void main(String[] args) {
        System.out.println(MVEL.eval("5 > 2"));
        System.out.println(MVEL.eval("5 - 2"));

        Serializable expression = MVEL.compileExpression("5 + 2");
        Object result = MVEL.executeExpression(expression);
        System.out.println(result);

        Object result2 = MVEL.executeExpression(MVEL.compileExpression("[1, 2, 3] contains 2"));
        System.out.println(result2);

    }
}

其中, MVEL.compileExpression(string)是将表达式编译成mvel可执行的内容,然后通过MVEL.executeExpression(expression)执行。

Mvel表达式是默认支持一些方法的,像是上面例子中用到算术运算、list的contains方法等,同时也支持自定义方法。

自定义方法

某些场景我们需要更复杂的运算或者处理逻辑,这时候可以使用自定义方法。

大致流程:

1. 自定义方法

2. 将自定义方法添加到Mvel的ParserContext中

3. 基于ParserContext环境 编译和执行Mvel表达式

代码如下:

import org.apache.commons.lang3.StringUtils;

/**
 * 用户自定义方法
 *
 * @author: Danger
 */
public class UserFunction {

    /**
     * 字符串source 是否包含 target, 忽略大小写
     *
     * @param source
     * @param target
     * @return boolean
     */
    public static boolean containsIgnCase(String source, String target) {
        if (StringUtils.isEmpty(source) || StringUtils.isEmpty(target)) {
            return false;
        }
        if (source.toUpperCase().contains(target.toUpperCase())) {
            return true;
        }

        return false;
    }
}
import org.apache.commons.lang3.StringUtils;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;

import java.io.Serializable;
import java.lang.reflect.Method;

/**
 * Mvel编译
 *
 * @author: Danger
 */
public class MvelCompiler {

    private static final MvelCompiler instance = new MvelCompiler();

    private static ParserContext context;

    private MvelCompiler() {
        context = new ParserContext();

        // 将UserFunction类中的所有方法加载到context中
        Method[] declaredMethods = UserFunction.class.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            context.addImport(declaredMethod.getName(), declaredMethod);
        }

        // 或者用下面这种一个个指定的方式加载到context中
//        context.addImport("containsIgnCase", MVEL.getStaticMethod(UserFunction.class, "containsIgnCase", new Class[]{String.class, String.class}));
    }

    public static MvelCompiler getInstance() {
        return instance;
    }

    public Serializable compile(String expression) {
        if (StringUtils.isNotEmpty(expression)) {
            return MVEL.compileExpression(expression, context);
        }

        return null;
    }
}

测试验证:

/**
 * Mvel测试
 *
 * @author: Danger
 */
public class MvelTest {

    public static void main(String[] args) {
        ParserContext parserContext = new ParserContext();
        parserContext.addImport("containsIgnCase", MVEL.getStaticMethod(UserFunction.class, "containsIgnCase", new Class[]{String.class, String.class}));
        Serializable expression1 = MVEL.compileExpression("containsIgnCase('abc', 'BC')", parserContext);
        Object result3 = MVEL.executeExpression(expression1);
        System.out.println(result3);

        Object result4 = MVEL.executeExpression(MvelCompiler.getInstance().compile("containsIgnCase('abc', 'D')"));
        System.out.println(result4);
    }
}

 

以上。

### MVEL 表达式语言中的 `max` 函数使用方法 MVEL 是一种轻量级的表达式语言,广泛用于 Java 应用程序中执行动态计算条件逻辑。关于 `max` 函数,在 MVEL 中可以通过内置支持来比较两个或多个数值并返回最大值。 以下是有关 MVEL 的 `max` 函数的一些常见用法及其示例: #### 单纯数值比较 当需要比较两个简单数值时,可以直接调用 `Math.max()` 方法作为替代实现[^1],因为 MVEL 并未提供独立的 `max` 关键字,而是依赖于标准库的支持。例如: ```java // 假设我们有如下变量定义 int a = 5; int b = 10; // 使用 Math.max() 进行比较 int result = (int) MVEL.eval("Math.max(a, b)", new HashMap<String, Object>() {{ put("a", a); put("b", b); }}); System.out.println(result); // 输出 10 ``` #### 数组或集合的最大值提取 如果目标是从数组或列表中找到最大的元素,则可以结合循环或其他工具类完成此操作。下面是一个基于自定义脚本的例子: ```java List<Integer> numbers = Arrays.asList(3, 7, 2, 9); Integer maxValue = (Integer) MVEL.eval( "numbers.stream().max(Integer::compareTo).orElse(null)", new HashMap<String, Object>() {{ put("numbers", numbers); }} ); System.out.println(maxValue); // 输出 9 ``` 这里利用了 Java Stream API 来简化处理过程。 需要注意的是,尽管上述例子展示了如何间接达成目的,但严格意义上讲,这并非传统意义上的 “MVEL max function”。因此建议开发者查阅最新版本文档确认是否有新增特性[^3]。 另外值得注意的一点是,某些高级框架可能扩展了基础功能从而引入更便捷的方式;不过具体取决于实际使用的环境配置情况而定[^2]。 ```java // 如果存在假想中的原生支持形式可能是这样 Object evalResult = MVEL.eval("max(numbers)", contextMap); ``` 以上就是围绕 mvel max function usage and examples 展开的回答内容。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值