java表达式、java中jexl3的使用,java中jexl3如何自定义函数方法,jexl3自定义函数怎么传集合数组列表

news2024/9/24 3:27:45

引入jexl3

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jexl3</artifactId>
    <version>3.2.1</version>
</dependency>

基本用法

//引入对应包
import org.apache.commons.jexl3.*;

public class Application {

    public static void main(String[] args) {

        //创建对象
        JexlEngine jexl = new JexlBuilder().create();
        // 基本的表达式
        // 语法关系支持:and or && || | & == 可以使用括号
        JexlExpression expression = jexl.createExpression("a > b and c < a or c > a and a+b-c == 1");
        // 表达式中的变量赋值
        JexlContext jc = new MapContext();
        jc.set("a", 3);
        jc.set("b", 2);
        jc.set("c", 4);
        // 运行并获取值
        boolean result = (boolean) expression.evaluate(jc);
        // 打印结果
        System.out.println("结果为:"+result);
    }
}

运行结果:

自定义函数使用

  • 自定义一个类,会使用到该类中定义的方法
public class PriceFunction {
    /**
     * 函数名称
     */
    String functionName() {
        return "priceFunction";
    }

    //获取最大值
    public static Object getMax(int a, int b) {
        return Math.max(a, b);
    }
    //获取最小值
    public static Object getMin(int a, int b) {
        return Math.min(a, b);
    }
    // 获取列表中最大值
    public static Object getMaxByList(Byte... nums) {
        int max = 0;
        // 想要集合就只能收到后转一下,或者参数传String类型,根据指定符号拆一下就可以得到String类型的集合数组
//        List<Byte> list = Arrays.asList(nums);
        for (int i = 0; i < nums.length; i++) {
            if (max < Integer.parseInt(nums[i].toString())) {
                max = Integer.parseInt(nums[i].toString());
            }
        }
        return max;
    }
    // 两个列表中只能有num个相同值验证
    public static Object sameNumber(String list1, String list2, String num) {
        String [] strings1 = list1.split(",");
        String [] strings2 = list2.split(",");
        int n = 0;
        for (int i = 0; i < strings1.length; i++) {
            String s1 = strings1[i];
            for (int j = 0; j < strings2.length; j++) {
                String s2 = strings2[j];
                if (s1.equals(s2)){
                    n++;
                    //超过个数后就可以返回了
                    if(n > Integer.parseInt(num)){
                        return false;
                    }
                    break;
                }
            }
        }
        if (n == Integer.parseInt(num)){
            return true;
        } else {
            return false;
        }
    }
}
  • 引用上面类中的方法
//引入对应包
import org.apache.commons.jexl3.*;
import java.util.*;

public class Application {

    public static void main(String[] args) {
        JexlBuilder jexlBuilder = new JexlBuilder();
        Map<String, Object> functions = new HashMap<>();

        // 创建上面类的对象,并起一个名称(下面会使用到名称)
        functions.put("Func", new PriceFunction());
        // 或者不起名直接为null(不是字符串null,不要带引号): functions.put(null, new PriceFunction());

        jexlBuilder.namespaces(functions);
        JexlEngine jexlEngine = jexlBuilder.create();


        // 表达式想使用对应的函数时需要
        // Func:getMax 上面创建对象起的名称(Func):函数名称
        String expressionStr = "Func:getMax(a,b) == 4 and Func:getMin(a,b) == 3 and Func:getMaxByList(a,b,c) == 10 and Func:sameNumber(list1,list2,num)";
        // 如果上面创建对象时名称为null(不是字符串null,不要带引号):functions.put(null, new PriceFunction());
        // 则表达式可以直接写函数名称:getMax(a,b) == 4 and getMin(a,b)即可


        JexlExpression expression = jexlEngine.createExpression(expressionStr);
        MapContext mapContext = new MapContext();

        // 给对应的变量赋值
        mapContext.set("a", 3);
        mapContext.set("b", 4);
        mapContext.set("c", 10);
        mapContext.set("list1", "1,2,3,4,5,6,7");
        mapContext.set("list2", "5,6,7,8,9");
        mapContext.set("num", "3");

        Object evaluate = expression.evaluate(mapContext);
        System.out.println(String.format("结果为:%s", evaluate));
    }
}

运行结果为:

 将列表里相同的值改为4个,num为3,不相同这时结果就为false

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

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

相关文章

【STM32入门】3.OLED屏幕

1.OLED引脚 OLED屏幕的接线按图所示&#xff0c;本例中用的是4管脚OLED屏幕 2.驱动程序 配套的驱动程序是“OLED.c"&#xff0c;主要由以下函数构成&#xff1a;1、初始化&#xff1b;2、清屏&#xff1b;3、显示字符&#xff1b;4、显示字符串&#xff1b;5、显示数字…

杀虫剂市场分析:2022年市场规模突破100亿元

杀虫剂是杀死害虫的一种药剂&#xff0c;目前杀虫剂主要应用在农业种植领域中&#xff0c;其中水稻的应用占比最大。杀虫剂的分类繁多&#xff0c;目前市场上主要以有机磷杀虫剂等为主流。 杀虫剂是指被用于杀死昆虫或防止昆虫进行破坏性行为的化学物质&#xff0c;杀虫剂的种类…

C盘爆满,python pip无法安装应用

解决方法1 C盘扩容 从其他盘压缩空间&#xff0c;C盘使用压缩的空间进行扩容&#xff0c;治标不治本&#xff0c;以后C盘还会越来越大 解决方法2 转移pip安装目录 1. 获取显示pip安装目录 C:\Users\biewang>pip show pip Name: pip Version: 23.3.1 Summary: The PyPA r…

品牌保护与知识产权:跨境电商中的法律挑战与解决方案

随着跨境电商的蓬勃发展&#xff0c;品牌保护和知识产权问题日益成为业界关注的焦点。在全球范围内进行电商业务&#xff0c;涉及到多国法律法规的复杂性&#xff0c;品牌所有者需要面对一系列法律挑战&#xff0c;保护其品牌和知识产权不受侵害。本文将深入探讨跨境电商中面临…

操作系统概论:揭秘计算机背后的神秘力量

操作系统概论 & 功能 概述定义操作系统功能作为系统资源的管理者向上层提供方便易用的服务作为最接近硬件的层次 主页传送门&#xff1a;&#x1f4c0; 传送 概述 概念&#xff1a; 定义 控制和管理计算机硬件和软件资源的程序一种系统软件为上层用户、应用程序提供简单易…

关于对ArrayBlockingQueue 的AQS探究

1、介绍 条件队列是 AQS 中最容易被忽视的一个细节。大部分时候&#xff0c;我们都用不上条件队列&#xff0c;但是这并不说明条件队列就没有用处了&#xff0c;它反而是我们学习生产者-消费者模式的最佳教材。条件队列是指一个阻塞队列&#xff0c;其中的元素是等待某个条件成…

派对的最大快乐值

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 派对的最大快乐值 &#x1f48e;总结 派对的最大快乐值 题目 员工信息的定义如下&#xff1a; 公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、没有环的多叉树。树的头节点是公…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后&#xff0c;设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径&#xff0c;并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

css实现姓名两端对齐

1.1 效果 1.2 主要代码 text-align-last: justify; 1.3 html完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

外包干了3年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

【UE】UEC++ CurveFloat、CurveVector、CurveLinearColor

目录 【UE】UEC CurveFloat、CurveVector、CurveLinearColor 一、CurveFloat 二、CurveVector 三、CurveLinearColor 四、材质设置 五、运行结果 【UE】UEC CurveFloat、CurveVector、CurveLinearColor 一、CurveFloat #pragma once#include "CoreMinimal.h" …

人工智能时代AIGC绘画实战

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

RAG落地实践、AI游戏开发、上海·深圳·广州线下工坊启动!星河社区重磅周

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。飞…

如何无线桥接路由器,让你的网络覆盖范围变大,做到网络信号无缝连接

你是否希望通过在两个路由器之间创建无线网桥(网络桥接)来扩大网络覆盖范围?好吧,你来对地方了!在当今日益互联的世界,拥有一个强大可靠的网络比以往任何时候都更重要。 无线网桥允许你无线连接两个或多个路由器,有效地扩展网络覆盖范围,并在更大的区域提供无缝的互联…

算法-滑动窗口

一、滑动窗口思想 概念 在数组双指针里&#xff0c;我们介绍过 "对撞型" 和 "快慢型" 两种方式&#xff0c;而滑动窗口思想就是快慢型的特例。 实际使用 计算机网络中有滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;该协议…

02、pytest环境准备

工具准备 python官网下载&#xff1a;https://www.python.org/pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/python-office官网文档&#xff1a;http://www.python-office.com/ 参考…

OA系统是什么,能用低代码开发吗?

OA是什么&#xff1f;管办公室活动的 OA是Office Automation&#xff08;办公自动化&#xff09;的简称&#xff0c;原是指利用电脑进行全自动的办公&#xff0c;现在基本所有和办公相关的系统都可以称作是OA。绝大部分企业将OA用于企业内部的协作沟通&#xff0c;处理企业内部…

NSSCTF 文件上传漏洞题目

目录 [SWPUCTF 2021 新生赛]easyupload1.0 [SWPUCTF 2021 新生赛]easyupload2.0 [SWPUCTF 2021 新生赛]easyupload3.0 [SWPUCTF 2021 新生赛]easyupload1.0 这是一个文件上传漏洞的题目 我们的思路是上传一句话木马&#xff0c;用工具进行连接 先编写一句话木马 将文件后缀…

CSS实现小球边界碰撞回弹

如何通过CSS实现一个物体在屏幕中无限的边界碰撞回弹呢&#xff1f;我们可以使用动画效果实现 代码 我们只做一个小球&#xff0c;通过定位属性叠加动画的方式&#xff0c; 让小球在屏幕中进行运动&#xff0c;通过设置animation的alternate属性来设置回弹。最后&#xff0c;只…

为什么有很多公司的 ERP 系统用得还不如 Excel?

回顾ERP的发展历史&#xff0c;我们不难发现&#xff0c;ERP业务包含范围越来越广&#xff0c;但是让信息化适应业务、辅佐业务&#xff0c;是根植在ERP的诞生基因里面的。 ERP信息化的概念看上去如此美妙&#xff0c;但是在国内企业落地的时候&#xff0c;却出现了很多问题——…