java mvel_什么是MVEL?

java mvel_什么是MVEL?1 MVEL 是啥 它能做啥 简单来说是一种强大的表达式解析器 我们可以自己写一些表达式 交给 mvel 进行解析计算 得到这个表达式计算的值 玩概念 我不懂 还是举个例子靠谱 比如我们要进行一个加法运算 在 java 中我们这样写 intres 1 1 2 若我用 mvel 则这样写 Objectres MVEL eval 1 1 2 是不是很吃惊 1 1 就是一个表达

1.MVEL是啥?它能做啥?

简单来说是一种强大的表达式解析器。我们可以自己写一些表达式,交给mvel进行解析计算,得到这个表达式计算的值。玩概念,我不懂,?

还是举个例子靠谱。?

比如我们要进行一个加法运算。在java中我们这样写:

int res = 1+1; // 2

若我用mvel则这样写:

Object res = MVEL.eval(“1+1”); //2

是不是很吃惊?。“1+1”就是一个表达式,第一种我们是硬编码实现的计算结果,但是第二种方案,直接给evel函数传递一个表达式字符串,直接能计算出结果。这样如果想计算1-1。直接传人不同的表达式即可。现在要计算'(2+2)*3+5/2’或’2>1?1+1:2+2’。来吧你硬编码试试这些计算?是不是又要多写几行代码,而且不便扩展。

你以为mvel只能做这些了?那就真的是太年轻了。目前mvel支持大量的语法,条件,循环等。还可以支持自定义函数,这就?了。那么我们工作中用这东西来干嘛?

2.在自定义数据流转中的使用

① 啥是数据流转

数据流转就是不同对象间数据的转换。比如a对象数据通过某些规则转化为b对象数据。ca,这说的是不是数据清洗???。对,说的没错,但是数据清洗只是其中的一个具体项罢了。?,来个图:

631d78da5083d771a046ddb3406c9b22.png

由图可以看出两个对象name和age都是一对一映射,但是目标对象不需要sex字段,但是多了一个出生年的字段,而且是通过年龄计算而来。下面我们就以代码来模拟一下这个转换过程,在这里我对象都用map来定义。

HashMap srcMap = Maps.newHashMap();

srcMap.put(“name”,”zs”);

srcMap.put(“age”,10);

srcMap.put(“sex”,”女”);

//字段映射关系

HashMap mapping = Maps.newHashMap();

mapping.put(“name”,”name”);

mapping.put(“age”,”age”);

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

mapping.put(“birthYear”,”2019-age”);

//目标对象

HashMap targetMap = Maps.newHashMap();

//k为目标表字段,v为转换规则

mapping.forEach((k,v)->{

Object reValue = MVEL.eval(v,srcMap);

targetMap.put(k,reValue);

});

System.out.println(“源对象”+srcMap); //源对象{sex=女, name=zs, age=10}

System.out.println(“目标对象”+targetMap); //目标对象{birthYear=2009, name=zs, age=10}

对就这么简单,但是我们这里计算出生年份中的当前年份写死了啊。明细不不是我们想要的,没事我们慢慢来。

.自定义函数

定义获取当前年份函数

/

* 获取当前年份方法

* @return

*/

public static Object getCurrentYear(){

Calendar date = Calendar.getInstance();

String year = String.valueOf(date.get(Calendar.YEAR));

return year;

}

.将自定义函数注册

直接上代码

static ParserContext context = new ParserContext();

static {

//MvelTest是getCurrentYear函数的类

Method[] declaredMethods = MvelTest.class.getDeclaredMethods();

for(Method method : declaredMethods){

context.addImport(method.getName(),method);

}

}

.使用

直接将Object reValue = MVEL.eval(v,srcMap);替换为

Object reValue = MVEL.executeExpression(MVEL.compileExpression(v, context),srcMap);

即可。compileExpression的作用就是将我们的规则进行编译成mvel可以识别的一个过程

birthYear规则替换为mapping.put(“birthYear”,”getCurrentYear()-age”);执行得到相同的结果。

有了这些我们可以自定义更多的转换规则,还可以借此开发一套用户配置工具,根据用户自己的配置,进行相应的资源映射。得到想要的目标数据。

3.小结

这里只是在工作中用到mvel的一个小小的尝试。更多的研究后续进行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211687.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:50
下一篇 2026年3月18日 下午9:51


相关推荐

  • 俯瞰开源工作流引擎Activiti「建议收藏」

    俯瞰开源工作流引擎Activiti「建议收藏」Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,采用了宽松的ApacheLicence2.0开源协议,因此Activiti一经推出,就得到了开源社区的大力支持,在开源社区的支持下,Activiti吸引了很多的工作流专家参与到该项目中,并且也促使了Activiti在工作流领域的创新。

    2022年7月27日
    11
  • raid0和raid1的区别

    raid0和raid1的区别RAID是英文RedundantArrayofIndependentDisks的缩写,中文简称为独立冗余磁盘阵列。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。组成磁盘阵列的不同方式称为RAID级别(RAIDLevels)。集中管理思想:资源整合,用统一标准进行管理它们共同点…

    2022年7月15日
    20
  • mysql的左右连接_MySQL之左连接与右连接

    mysql的左右连接_MySQL之左连接与右连接左连接:select列1,列2,列NfromtableAleftjointableBontableA.列=tableB.列(正常是一个外键列)[此处表连接成一张大表,完全当成一张普通表看]where,having,groupby…照常写。右连接:select列1,列2,列NfromtableArightjointableBontableA.列=tableB…

    2025年11月12日
    5
  • SpringMVC入门

    SpringMVC入门

    2022年2月4日
    45
  • web服务器与web框架

    web服务器与web框架Web 服务器当我们在浏览器输入 URL 后 浏览器会先请求 DNS 服务器 获得请求站点的 IP 地址 然后发送一个 HTTPRequest 请求 给拥有该 IP 的主机 接着就会接收到服务器给我们的 HTTPResponse 响应 浏览器经过渲染后 以一种较好的效果呈现给我们 这个过程中 正是 Web 服务器在幕后默默做贡献 简单来说 Web 服务器是在运行在物理服务器上的一个程序 它永久地等待客户

    2026年3月17日
    1
  • DCGAN原文讲解

    DCGAN原文讲解DCGAN 的全称是 DeepConvolut 深度卷积生成对抗网络 是 2014 年 IanJ Goodfellow 的那篇开创性的 GAN 论文之后一个新的提出将 GAN 和卷积网络结合起来 以解决 GAN 训练不稳定的问题的一篇 paper 关于基本的 GAN 的原理 可以参考原始 paper 或者其他一些有用的文章和代码 比如 GANmn

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号