IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java处理字符串类型数学表达式 -> 正文阅读

[大数据]Java处理字符串类型数学表达式

前言

业务需求中遇到字符串所组成的数学表达式,替换完数据后想计算出结果;
类似于这样

 1. (400-0)*100+(600-400)*150+(配置值-600)*PV
 2.  配置值*PV*(-10)

但是让Java做字符串的数学操作很麻烦,所以引入新的jar处理

参考文档 QLExpress README.md

pom

QLExpress 为阿里开源的一个动态脚本引擎解析工具

 <!--https://search.maven.org/search?q=a:QLExpress-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>QLExpress</artifactId>
  <version>3.2.7</version>
</dependency>

示例一 数学公式


     public static void main(String[] args) throws Exception {

        ExpressRunner runner = new ExpressRunner();
        DefaultContext<String, Object> context = new DefaultContext<>();
        String str="(400-0)*100+(600-400)*150+(配置值-600)*PV";
        //注意数学运算时为数字 不是字符串 可理解为替换关键字 
        context.put("配置值",5);
        context.put("PV",1);
        Object result = runner.execute(str, context, null, true, false);

        System.out.println(result);

    }

注意自己替换的关键字后 式子必须为正确的可计算式子,出现未知数会报错
在这里插入图片描述

入参

/**
 * 执行一段文本
 * @param expressString 程序文本
 * @param context 执行上下文,可以扩展为包含ApplicationContext
 * @param errorList 输出的错误信息List
 * @param isCache 是否使用Cache中的指令集,建议为true
 * @param isTrace 是否输出详细的执行指令信息,建议为false
 * @param aLog 输出的log
 * @return
 * @throws Exception
 */

示例二 布尔值

有时候表达式的结果为布尔值,类似于这样

 配置值=3
 配置值>4
 配置值<=9
 1<配置值<5
 1<=配置值<=5
 >15

需要知道是否符合某个指定条件

普通java语法

//支持 +,-,*,/,<,>,<=,>=,==,!=,<>【等同于!=】,%,mod【取模等同于%】,++,--,
//in【类似sql】,like【sql语法】,&&,||,!,等操作符
//支持for,break、continue、if then else 等标准的程序控制逻辑
n = 10;
sum = 0;
for(i = 0; i < n; i++) {
   sum = sum + i;
}
return sum;

//逻辑三元操作
a = 1;
b = 2;
maxnum = a > b ? a : b;

这些他是支持的,But,业务中的拓展,类似于配置值=31<配置值<5 这类替换情况,这个工具类不能处理,因为Java语言识别布尔有特定条件,正确表达为

配置值=3     ==>    配置值==3 (需要两个等于号)
1<配置值<5   ==>    1<配置值 && 配置值<5 (需要分别做判断再与操作)
>15          ==>    配置值>15(缺乏替换配置条件,必须有个关键字用来后续替换)

为了解决上述问题,我们在传参之前,需要对表达式进行处理

     private String defaultValue="配置值";
    private String defaultValue2="<配置值<";
    private String defaultValue3="<=配置值<";
    private String defaultValue4="<=配置值<=";
    private String defaultValue5="<配置值<=";
    public String judgeStr(String str){
        //无关键字 >15
        if(!str.contains(defaultValue)){
            return defaultValue+str;
        }
        //配置值=4
        if(str.contains(defaultValue+"=")){
            return str.replace("=","==");
        }
        //1<配置值<=4
        if(str.contains(defaultValue2)||str.contains(defaultValue3)||str.contains(defaultValue4)||str.contains(defaultValue5)){
            return str.replace(defaultValue,defaultValue+"&&"+defaultValue);
        }
        System.out.println("其他表达式:"+str);
        return str;
    }
 Object result = runner.execute(judgeStr(str), context, null, true, false);

输出为布尔值
在这里插入图片描述

拓展

另一个工具类也可以处理上述请求,可以尝试JEP

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:39:43  更:2022-03-04 15:43:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:18:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码