jexl3动态计算表达式

这篇具有很好参考价值的文章主要介绍了jexl3动态计算表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 背景

Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不是 JSTL 中的表达式语言的实现。

  • 使用场景

  1. 实时引擎里

  1. 动态逻辑计算分离

  1. 计算逻辑经常变化或者可视化逻辑配置

  • 学习实例

  • 引入JAR包

引入Maven包,我这里使用版本最新版本3.2.1版本号。

       <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-jexl3</artifactId>
            <version>3.2.1</version>
        </dependency>
  • 第一个实例

通过一个用户在商场购买香蕉、苹果来计算总金额为程序计算场景。苹果5.6一斤、香蕉7.2一斤;用户买2斤苹果,3斤香蕉

JexlBuilder jexlBuilder = new JexlBuilder();
JexlEngine jexlEngine = jexlBuilder.create();
//苹果5.6一斤、香蕉7.2一斤;用户买2斤苹果,3斤香蕉
String expressionStr = "2*5.6+7.2*3";
JexlExpression expression = jexlEngine.createExpression(expressionStr);
MapContext mapContext = new MapContext();
Object evaluate = expression.evaluate(mapContext);
System.out.println(String.format("应支付金额:%s", evaluate));
  • 变量计算实例

通过MapContext把表达式需要值传送变量到表达式里,完成用户应付金额。

JexlBuilder jexlBuilder = new JexlBuilder();
JexlEngine jexlEngine = jexlBuilder.create();
//苹果5.6一斤、香蕉7.2一斤;用户买2斤苹果,3斤香蕉
String expressionStr = "applePrice*appleTotal+bananaPrice*bananaTotal";
JexlExpression expression = jexlEngine.createExpression(expressionStr);
MapContext mapContext = new MapContext();
mapContext.set("applePrice", 5.6);
mapContext.set("appleTotal", 2);
mapContext.set("bananaPrice", 7.2);
mapContext.set("bananaTotal", 3);
Object evaluate = expression.evaluate(mapContext);
System.out.println(String.format("用用应支付金额:%s", evaluate));
  • 访问对象实例

我们在应该开发时,我们的数据一般封装为JAVA对象,我们在表达式中可以访问与设置对象的值。

JexlBuilder jexlBuilder = new JexlBuilder();
JexlEngine jexlEngine = jexlBuilder.create();
//苹果5.6一斤、香蕉7.2一斤;用户买2斤苹果,3斤香蕉
String expressionStr = "applePrice*appleTotal+bananaPrice*bananaTotal";
JexlExpression expression = jexlEngine.createExpression(expressionStr);
MapContext mapContext = new MapContext();
mapContext.set("applePrice", 5.6);
mapContext.set("appleTotal", 2);
mapContext.set("bananaPrice", 7.2);
mapContext.set("bananaTotal", 3);
Object evaluate = expression.evaluate(mapContext);
System.out.println(String.format("应支付金额:%s", evaluate));

定义商品订单对象为

public class OrderDto implements Serializable {
    private Double totalPrice;
    private List<OrderItemDto> orderItems;

    public Double getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(Double totalPrice) {
        this.totalPrice = totalPrice;
    }

    public List<OrderItemDto> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<OrderItemDto> orderItems) {
        this.orderItems = orderItems;
    }

    public static class OrderItemDto {
        private Double price;
        private Integer num;
        private String name;

        public OrderItemDto(Double price, Integer num, String name) {
            this.price = price;
            this.num = num;
            this.name = name;
        }

        public OrderItemDto() {
        }

        public OrderItemDto(Double price, Integer num) {
            this.price = price;
            this.num = num;
        }

        public Double getPrice() {
            return price;
        }

        public void setPrice(Double price) {
            this.price = price;
        }

        public Integer getNum() {
            return num;
        }

        public void setNum(Integer num) {
            this.num = num;
        }
    }
  • 自定义函数

在业务开发中,我们使用表达式计算不一定满足我们业务需要,我们可以在我们表达式使用自己开发的方法,计算应付金额通过函数来完成。

public class PriceFunction {
    /**
     * 函数名称
     *
     * @return 名称
     */
    String functionName() {
        return "priceFunction";
    }

    /**
     * 计算结果
     *
     * @param arg 参数
     * @return 返回值
     */
   public static Object   excute(List<OrderDto.OrderItemDto> arg) {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        double totalPrice = 0.0D;
        for (OrderDto.OrderItemDto dto: arg) {
            totalPrice += dto.getPrice() * dto.getNum();
        }
        return  totalPrice;
    }
}

计算表达式文章来源地址https://www.toymoban.com/news/detail-508471.html

JexlBuilder jexlBuilder = new JexlBuilder();
Map<String, Object> functions = new HashMap<>();
functions.put("cacl", new PriceFunction());
jexlBuilder.namespaces(functions);
JexlEngine jexlEngine = jexlBuilder.create();
//苹果5.6一斤、香蕉7.2一斤;用户买2斤苹果,3斤香蕉
OrderDto orderDto = new OrderDto();
List<OrderDto.OrderItemDto> orderItemDtos = new ArrayList<>();
orderItemDtos.add(new OrderDto.OrderItemDto(5.6, 2, "苹果"));
orderItemDtos.add(new OrderDto.OrderItemDto(7.2, 3, "香蕉"));
orderDto.setOrderItems(orderItemDtos);
String expressionStr = "cacl:excute(order.orderItems)";
JexlExpression expression = jexlEngine.createExpression(expressionStr);
MapContext mapContext = new MapContext();
mapContext.set("order", orderDto);
Object evaluate = expression.evaluate(mapContext);
System.out.println(String.format("应支付金额:%s", evaluate));
  • 三元表达式实例

        JexlBuilder jexlBuilder = new JexlBuilder();
        JexlEngine jexlEngine = jexlBuilder.create();
        //3元表达式
        String expressionStr = "(1< 2)? '真':'假'";
        JexlExpression expression = jexlEngine.createExpression(expressionStr);
        MapContext mapContext = new MapContext();
        Object evaluate = expression.evaluate(mapContext);
        System.out.println(String.format("结果:%s", evaluate));
  • IF/FOR语法支持

        JexlBuilder jexlBuilder = new JexlBuilder();
        Log log = LogFactory.getLog(JexDemoGrammar.class);
        JexlEngine jexlEngine = jexlBuilder.logger(log).create();
        //IF判断表达式
        String expressionStr = "if(1< 2){ return '真';}else{ return '假';}";
        JexlScript expression = jexlEngine.createScript(expressionStr);
        MapContext mapContext = new MapContext();

        Object evaluate = expression.execute(mapContext);
        System.out.println(String.format("结果:%s", evaluate));
        //For 循环
        String expressionFor = "while (i lt  100) {  i = i + 1;total = total + i;}";
        JexlScript scriptFor = jexlEngine.createScript(expressionFor);
        MapContext context = new MapContext();
        context.set("len", 100);
        context.set("total", 0);
        context.set("i", 0);
        context.set("log", log);
        Object execute = scriptFor.execute(context);
        System.out.println(String.format("结果:%s", execute));

到了这里,关于jexl3动态计算表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Expression Lambda表达式树的通用复杂动态查询构建器——《原型篇一》[已开源]

    续接上编,本篇来讲讲俄罗斯套娃的设计与实现。 首先简单地完善一下前面提到的例子,代码如下: 测试实体类 独立条件类 条件组类 枚举   接下来,先构建查询条件描述器对象,由于例子代码比较简略,仅用于方便说明设计思路和方法,如果哪位看官直接拿来实用,请先备

    2024年02月06日
    浏览(28)
  • 【c#表达式树】最完善的表达式树Expression.Dynamic的玩法

    在我第一次写博客的时候,写的第一篇文章,就是关于表达式树的,链接:https://www.cnblogs.com/1996-Chinese-Chen/p/14987967.html,其中,当时一直没有研究Expression.Dynamic的使用方法(因为网上找不到资料),就了解到是程序运行时动态去构建表达式树,举个例子,例如我们需要在我们的

    2023年04月11日
    浏览(28)
  • Python正则表达式Regular Expression初探

    目录 Regular 匹配规则 单字符匹配  数量匹配 边界匹配  分组匹配 贪婪与懒惰 原版说明 特殊字符 转义序列 模块方法 函数说明 匹配模式 常用匹配规则 1. 匹配出所有整数 2. 匹配11位且13开头的整数 Python的re模块提供了完整的正则表达式功能。正则表达式(Regular Expression)是一

    2024年01月22日
    浏览(37)
  • oracle的正则表达式(regular expression)

    当前,正则表达式已经在很多软件中得到广泛的应用,包括Linux, Unix,HP等操作系统,PHP,C#,Java等开发环境,ORACLE则在10G中推出了自己的正则表达式。 Oracle 10g正则表达式提高了SQL灵活性,有效的解决了数据有效性, 重复词的辨认, 无关的空白检测,或者分解多个正则组成的

    2024年02月07日
    浏览(34)
  • 表达式树(Expression)的执行、解释与创建

    前言:在这里不进行概念性描述,能看到这篇文章说明你已经知道如何使用表达式树 这里需要说明下表达式树是表示代码的数据结构,并不是经过编译且可执行的代码,如果想要执行由表达式树表示的 .NET 代码,必须将其转换为可执行的 IL 指令。这时候我们需要调用编译函

    2024年02月22日
    浏览(27)
  • C#Regex正则表达式(Regular Expression)

    在C#中,Regex是正则表达式(Regular Expression)的缩写,它是一种强大的文本匹配和处理工具。正则表达式是一种用于描述模式的字符串,它可以用来在文本中查找、替换和提取满足特定模式的内容。 在C#中,你可以使用System.Text.RegularExpressions命名空间下的Regex类来操作正则表达

    2024年02月05日
    浏览(31)
  • Java动态脚本&规则引擎、计算/表达式引擎

    在日常的Java项目中,我们免不了会遇到这样的需求: 动态地获取并运行自定义脚本文件,以实现特定的功能 对数据流执行用户自定义的数据有效性、公式计算、数据处理ETL(如数据截取、拼接)等不同业务逻辑 对用户输入的代码或脚本文件进行测试、运行,确保其语法正确

    2023年04月27日
    浏览(26)
  • 【P15】JMeter 正则表达式提取器(Regular Expression Extractor)

    接口需要关联时,可以通过正则表达式提取所需要的值 右键 添加 后置处理器 正则表达式提取器(Regular Expression Extractor) Apply to Main sample and sub-samples:匹配范围包括当前父取样器并覆盖子取样器 Main sample only:默认;匹配范围是当前父取样器 Sub-samples only :仅匹配子取样器

    2024年02月07日
    浏览(32)
  • LangChain 67 深入理解LangChain 表达式语言30 调用tools搜索引擎 LangChain Expression Language (LCEL)

    LangChain系列文章 LangChain 50 深入理解LangChain 表达式语言十三 自定义pipeline函数 LangChain Expression Language (LCEL) LangChain 51 深入理解LangChain 表达式语言十四 自动修复配置RunnableConfig LangChain Expression Language (LCEL) LangChain 52 深入理解LangChain 表达式语言十五 Bind runtime args绑定运行时参数

    2024年01月23日
    浏览(45)
  • Java中使用MapStruct实现对象转换时使用@Mapping的expression表达式实现自定义转换规则(多对一、获取当前Date)

    Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter: Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter_霸道流氓气质的博客-CSDN博客 上面介绍了mapstruct的简单使用,某些场景下需要自定义转换规则,比如记录时间字

    2024年02月14日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包