Java使用MVEL公式引擎

为了增加更多的常用方法,如 summaxmin 等等,我们可以扩展 Helper 类以包含这些方法。这样,MVEL 表达式就可以直接调用这些方法来执行相应的计算。我们将确保这些方法可以处理多种数值类型,并且返回适当的数值类型(如 BigDecimal)以保证高精度。

扩展 Helper 类

我们将为 Helper 类添加 summaxmin 方法,并确保它们能够处理不同类型的数值输入(如 intdoubleBigDecimal),同时保持与 avg 方法相同的转换逻辑。

定义 Helper 类
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class Helper {// 将 Number 转换为 BigDecimalprivate BigDecimal toBigDecimal(Number number) {if (number instanceof BigDecimal) {return (BigDecimal) number;} else if (number instanceof Double || number instanceof Float) {return new BigDecimal(number.toString());} else {return BigDecimal.valueOf(number.longValue());}}// 计算平均值的方法,接受多个 Number 类型参数public BigDecimal avg(Number... numbers) {if (numbers.length == 0) return null;List<BigDecimal> bigDecimals = Arrays.stream(numbers).map(this::toBigDecimal).collect(Collectors.toList());BigDecimal sum = bigDecimals.stream().reduce(BigDecimal.ZERO, BigDecimal::add);return sum.divide(BigDecimal.valueOf(numbers.length), BigDecimal.ROUND_HALF_UP);}// 计算总和的方法,接受多个 Number 类型参数public BigDecimal sum(Number... numbers) {List<BigDecimal> bigDecimals = Arrays.stream(numbers).map(this::toBigDecimal).collect(Collectors.toList());return bigDecimals.stream().reduce(BigDecimal.ZERO, BigDecimal::add);}// 计算最大值的方法,接受多个 Number 类型参数public BigDecimal max(Number... numbers) {if (numbers.length == 0) return null;List<BigDecimal> bigDecimals = Arrays.stream(numbers).map(this::toBigDecimal).collect(Collectors.toList());return bigDecimals.stream().max(BigDecimal::compareTo).orElse(null);}// 计算最小值的方法,接受多个 Number 类型参数public BigDecimal min(Number... numbers) {if (numbers.length == 0) return null;List<BigDecimal> bigDecimals = Arrays.stream(numbers).map(this::toBigDecimal).collect(Collectors.toList());return bigDecimals.stream().min(BigDecimal::compareTo).orElse(null);}
}

主程序代码

下面是完整的示例代码,展示了如何使用 Map<String, Object> 来构建和评估复杂的 MVEL 表达式,并兼容不同的数值类型:

 

import org.mvel2.MVEL;import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;public class ComplexMVELExpression {public static void main(String[] args) {// 创建一个映射来保存我们的函数和变量Map<String, Object> vars = new HashMap<>();// 创建 Helper 类的实例Helper helper = new Helper();// 将 Helper 实例添加到变量映射中vars.put("helper", helper);// 创建示例数据:inputMap 和 flavorMap,使用 Object 类型以支持多种数值类型Map<String, Object> inputMap = new HashMap<>();inputMap.put("vCPU", 8); // 示例 vCPU 值,int 类型inputMap.put("内存", 16.0); // 示例 内存值,double 类型Map<String, Object> flavorMap = new HashMap<>();flavorMap.put("CPU数量", 4); // 示例 CPU 数量,int 类型flavorMap.put("CPU型号", new BigDecimal("3.5")); // 示例 CPU 型号,BigDecimal 类型flavorMap.put("内存数量", 2); // 示例 内存 数量,int 类型flavorMap.put("内存型号", new BigDecimal("2.66")); // 示例 内存 型号,BigDecimal 类型// 将示例数据也添加到变量映射中vars.put("input", inputMap);vars.put("flavor", flavorMap);// 复杂表达式字符串String complexExpression = "helper.avg(input['vCPU'] / (3 * flavor['CPU数量'] * flavor['CPU型号']), " +"input['内存'] / (flavor['内存数量'] * flavor['内存型号']))";// 使用 eval 直接执行表达式并传入变量映射try {// 由于我们返回的是 BigDecimal,所以这里直接强转BigDecimal result = (BigDecimal) MVEL.eval(complexExpression, vars);// 输出结果System.out.println("Average Result: " + result);} catch (Exception e) {e.printStackTrace();}// 测试其他方法String sumExpression = "helper.sum(input['vCPU'], flavor['CPU数量'])";String maxExpression = "helper.max(input['vCPU'], flavor['CPU数量'])";String minExpression = "helper.min(input['vCPU'], flavor['CPU数量'])";try {BigDecimal sumResult = (BigDecimal) MVEL.eval(sumExpression, vars);BigDecimal maxResult = (BigDecimal) MVEL.eval(maxExpression, vars);BigDecimal minResult = (BigDecimal) MVEL.eval(minExpression, vars);// 输出结果System.out.println("Sum Result: " + sumResult);System.out.println("Max Result: " + maxResult);System.out.println("Min Result: " + minResult);} catch (Exception e) {e.printStackTrace();}}
}

在这个例子中,我们做了以下几件事:

定义了 Helper 类:它包含了 avg、sum、max 和 min 方法,可以接受多个 Number 类型参数,并将其转换为 BigDecimal 进行高精度计算。
设置了变量映射:将 Helper 实例、inputMap 和 flavorMap 都添加到了变量映射中,这样 MVEL 表达式就可以访问它们。注意,inputMap 和 flavorMap 中的值使用 Object 类型,以支持多种数值类型(如 int、double 和 BigDecimal)。
构建了复杂的 MVEL 表达式:使用了方括号符号来访问映射中的键(例如 input['vCPU']),以及数学运算符来进行计算。
测试其他方法:除了复杂表达式外,还测试了 sum、max 和 min 方法,以确保它们能够正确工作。
通过这种方式,你可以使用 Map<String, Object> 来构建和评估更加复杂的 MVEL 表达式,并且确保表达式能够兼容多种数值类型。如果有其他问题或需要更多帮助,请随时告知!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑皮书-计算机科学导论02

目录 第二部分&#xff1a;计算机硬件 第5章计算机组成 5.1中央处理单元 Ⅰ.算数逻辑单元 Ⅱ.控制单元 Ⅲ.寄存器 5.2主存储器 Ⅰ.随机存取存储器(RAM) Ⅱ.只读存储器(ROM) 高速缓冲存储器(Cache) 5.3输入/输出子系统 Ⅰ.非存储设备 Ⅱ.存储设备&#xff08;辅助存…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号&#xff1a;小白的大数据之旅 在小程序的开发过程中&#xff0c;插件作为扩展功能、提升效率的重要工具&#xff0c;扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块&#xff0c;还能优化开发流程&#xff0c;缩短项目周期。 …

优选算法——分治(快排)

1. 颜色分类 题目链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a;本题其实就要将数组最终分成3块儿&#xff0c;这也是后面快排的优化思路&#xff0c;具体大家来看下图。 这里我们上来先定义了3个指针&…

go开发中interface和方法接收器的使用

Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖&#xff0c;能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同&#xff0c;Go 的接口无需显式声明“我实现了你”&#xff0c;只要你满足了接口规定的方法&#xff0c;Go 就会自动认…

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在&#xff0c;数据同步&#xff08;想起来&#xff09;相对简单。而llm的chat在缺失这两个机制的情况下&#xff0c;没见到特别好的做到了数据同步的产品。 llm chat主要两…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域&#xff0c;GPU&#xff08;图形处理单元&#xff09;因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及&#xff0c;越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【毕业设计选题】数据科学与大数据专业毕业设计选题与建议

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

大数据笔记之flink-cdc实时同步数据

大数据笔记之flink-cdc实时同步数据(mysql -->doris) 一、基本概念 Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;。 该工具使得用户能够以 YAML配置文件的形式&#xff0c;优雅地定义其 ETL&…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”&#xff1a;深入剖析与误区澄清 引言 在与大语言模型&#xff08;LLM&#xff09;交互时&#xff0c;“prompt”&#xff08;提示符&#xff09;这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入&#xff0c;决定了模型的…

linux/centOS7用户和权限管理笔记

linux系列中可以&#xff1a; 配置多个用户配置多个用户组用户可以加入多个用户中 linux中关于权限的管理级别有2个级别&#xff0c;分别是&#xff1a; 针对用户的权限控制针对用户组的权限控制 一&#xff0c;root用户 root用户拥有最大的系统操作权限&#xff0c;而普通…

sheng的学习笔记-AI-注意力模型(Attention Model)

Ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 先看下这两个文章&#xff1a; 序列模型&#xff1a;sheng的学习笔记-AI-序列模型&#xff08;Sequence Models&#xff09;&#xff0c;RNN,GRU,LSTM_音乐识别是一对多吗-CSDN博客 机器翻译 sheng的学习笔记-AI-自然语…

el-table组件树形数据修改展开箭头

<style lang"scss" scoped> ::v-deep .el-table__expand-icon .el-icon-arrow-right:before {content: ">"; // 箭头样式font-size: 16px; }::v-deep .el-table__expand-icon{ // 没有展开的状态background-color: rgba(241, 242, 245, 1);color:…

已解决:elasticsearch创建索引失败

报错信息 具体报错&#xff1a; org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonunknown setting [index.mappings.properties.category.analyzer] please check that any required plugins are installed…

JAVA学习笔记——第十一章 枚举和注解

一、引出枚举类 1.先看一个需求demo package com.hspedu.enum_;public class Enumration01 {public static void main(String[] args) {Season Spring new Season("春天", "温暖");Season Summer new Season("夏天", "炎热");Seas…

GeeCache-单体并发缓存

实现LRU中value接口的缓存类 使用互斥锁封装LRU缓存类&#xff0c;实现并发访问 实现Group组&#xff0c;用名称对缓存分类 Getter为缓存击穿时调用的回调函数 若缓存击穿则调用回调函数&#xff0c;并把读取到的值加载到缓存中

吸烟抽烟行为识别数据集-超高识别率,支持YOLO,COCO,VOC格式的标注,10162张各种姿势场景下的吸烟图片

吸烟抽烟行为识别数据集-超高识别率&#xff0c;支持YOLO&#xff0c;COCO,VOC格式的标注&#xff0c;10162张各种姿势场景下的吸烟图片 数据集分割 训练组91&#xff05; 9279图片 有效集5&#xff05; 507图片 测试集4% 376图片 预处理 自动定…

云原生基础设施指南:精通 Kubernetes 核心与高级用法

1. 云原生的诞生 随着互联网规模的不断增长&#xff0c;以及企业对敏捷开发、快速交付和高可用性的需求日益增强&#xff0c;传统的单体架构逐渐暴露出局限性&#xff0c;难以满足现代业务对动态扩展和高效迭代的要求。为此&#xff0c;云原生应运而生。 云原生是为云计算时代…

使用Windbg排查C++软件安装包安装时被安全软件拦截导致安装堵塞(线程卡住)的问题

目录 1、问题描述 2、初步分析 3、将Windbg附加到安装包进程上进行分析 4、在Windbg中查看相关变量的值&#xff0c;并设置断点进行动态调试 4.1、在Windbg中查看相关变量的值 4.2、在Windbg中使用bp命令设置断点进行动态调试 5、腾讯电脑管家已经退出&#xff0c;但其…

【OJ题解】面试题三步问题

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…