fel的简单使用及介绍

article/2025/9/13 21:03:56

Fel介绍

Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。

Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。
Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)

Fel有多快?
通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。速度是Jexl-2.0的20倍以上。目前还没有发现开源的表达式引擎比Fel快。

 

为何要使用Fel?
Fel语法和API非常简单,语法与Java基本相同,几乎没有学习成本。

Fel非常快,上面已经做了简单说明。

Fel整个包只有200多KB。

Fel可以非常方便的访问数组、集合、Map的元素和对象的属性。

Fel可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。

Fel支持大数值高精度计算

Fel有良好的安全管理功能

如果Fel不能满足你的要求,扩展和修改Fel很简单。

Fel不能做什么?
Fel只支持表达式,不支持脚本。

Fel适用场景:
Fel适合处理海量数据,Fel良好的扩展性可以更好的帮助用户处理数据。

Fel同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)

创建项目引入依赖

<!-- https://mvnrepository.com/artifact/org.eweb4j/fel -->
<dependency><groupId>org.eweb4j</groupId><artifactId>fel</artifactId><version>0.8</version>
</dependency>

使用方式

1、算术方程式

    public static void main(String[] args){arithmetic();// 算术方程式}private static void arithmetic(){FelEngine fel = new FelEngineImpl();Object result = fel.eval("(6552*365+12000)/12");System.out.println(result);}

2、变量方式

  获取变量进行计算表达

    public static void main(String[] args){arithmetic();// 算术方程式System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");variable();// 变量法}private static void arithmetic(){FelEngine fel = new FelEngineImpl();Object result = fel.eval("(6552*365+12000)/12");System.out.println(result);}private static void variable(){FelEngine fel = new FelEngineImpl();FelContext ctx = fel.getContext();ctx.set("日计数", 6552);ctx.set("天数", 365);ctx.set("基础费用", 12000);ctx.set("月份",12);Object result = fel.eval("(日计数*天数+基础费用)/月份");System.out.println(result);}

3、可以使用对象属性进行计算

    public static void main(String[] args){objectDetil();}private static void objectDetil(){FelEngine fel = new FelEngineImpl();FelContext ctx = fel.getContext();Map<String,String> m = new HashMap<String,String>();m.put("ElName", "我是map的value");ctx.set("m",m);// 调用m.get('ElName')方法。Object result = fel.eval("m.get('ElName')");// 调用m.size()方法。Object size = fel.eval("m.size()");System.out.println(result+"     size = "+size);}

4、获取数组,集合,map

跟上面一样使用的 fel.eval(“xxx”)来获取对象内容

    private static void array(){FelEngine fel = new FelEngineImpl();FelContext ctx = fel.getContext();//数组int[] intArray = {1,2,3};ctx.set("intArray",intArray);//获取intArray[0]String exp = "intArray[0]";System.out.println(exp+"->"+fel.eval(exp));//ListList<Integer> list = Arrays.asList(1,2,3);ctx.set("list",list);//获取list.get(0)exp = "list[0]";System.out.println(exp+"->"+fel.eval(exp));//集合Collection<String> coll = Arrays.asList("a","b","c");ctx.set("coll",coll);//获取集合最前面的元素。执行结果为"a"exp = "coll[0]";System.out.println(exp+"->"+fel.eval(exp));//迭代器Iterator<String> iterator = coll.iterator();ctx.set("iterator", iterator);//获取迭代器最前面的元素。执行结果为"a"exp = "iterator[0]";System.out.println(exp+"->"+fel.eval(exp));//MapMap<String,String> m = new HashMap<String, String>();m.put("name", "HashMap");ctx.set("map",m);exp = "map.name";System.out.println(exp+"->"+fel.eval(exp));//多维数组int[][] intArrays= {{11,12},{21,22}};ctx.set("intArrays",intArrays);exp = "intArrays[0][0]";System.out.println(exp+"->"+fel.eval(exp));//多维综合体,支持数组、集合的任意组合。List<int[]> listArray = new ArrayList<int[]>();listArray.add(new int[]{1,2,3});listArray.add(new int[]{4,5,6});ctx.set("listArray",listArray);exp = "listArray[0][0]";System.out.println(exp+"->"+fel.eval(exp));}

5、调用java方法

    private static void java(){FelEngine fel = new FelEngineImpl();FelContext ctx = fel.getContext();ctx.set("out", System.out);fel.eval("out.println('Hello Word'.substring(6))");}

6、编译执行

    private static void install(){FelEngine fel = new FelEngineImpl();FelContext ctx = fel.getContext();ctx.set("日计数", 6552);ctx.set("天数", 365);ctx.set("基础费用", 12000);ctx.set("月份",12);Expression exp = fel.compile("(日计数*天数+基础费用)/月份",ctx);Object result = exp.eval(ctx);System.out.println(result);}

适合处理海量数据,编译执行的速度基本与Java字节码执行速度一样快。

7、自定义函数

    private static void custom(){//定义hello函数Function fun = new CommonFunction() {@Overridepublic String getName() {return "hello";}/** 调用hello("xxx")时执行的代码*/@Overridepublic Object call(Object[] arguments) {Object msg = null;if(arguments!= null && arguments.length>0){msg = arguments[0];}return ObjectUtils.toString(msg);}};FelEngine e = new FelEngineImpl();//添加函数到引擎中。e.addFun(fun);String exp = "hello('test')";//解释执行Object eval = e.eval(exp);System.out.println("hello "+eval);//编译执行Expression compile = e.compile(exp, null);eval = compile.eval(null);System.out.println("hello "+eval);}

参考博客:Fel是轻量级的高效的表达式计算引擎学习(一)

 

 

-------------------------IDEA引入本地jar包

选择jar包确定即可


http://chatgpt.dhexx.cn/article/ilQXtKEN.shtml

相关文章

Fel实现自定义计算引擎,平均计算速度每秒10w

Fel的介绍和简单使用以及0.9版本的包在之前的博客写过了&#xff0c;有需要的朋友移步&#xff1a;fel的简单使用及介绍 项目地址&#xff1a;https://github.com/an-yusheng/CSDN-FelDemo 1. 基础的应用 下面的代码是引用原生类进行执行的&#xff0c;支持通用数学函数即加减…

访问SMBus设备

使用SMBus访问温度传感器&#xff0c;并控制smart Fan 首先聊聊SMBus的访问方法 硬件上&#xff1a;两条线SMBus Clock和Data信号 当clock信号为高时data信号才有效&#xff0c;data信号下降&#xff0c;意味着Start。data信号上升&#xff0c;意味着Stop。开始后会发送九位&…

SMBUS通信波形分析

SMbus通信协议 1.特性 SMBus是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总 线规范。和 I2C一样&#xff0c;SMBus不需增加额外引脚&#xff0c;创建该总线主要…

DSP SMBus总线通信

参考文档&#xff1a;System Management Bus (SMBus) Specification Version 3.0.pdf 简介&#xff1a; SMBus&#xff08;System Management Bus&#xff09;于1995年被 Intel 提出&#xff0c;应用于低速率通信&#xff0c;是一种二线制串行总线&#xff0c;该总线大部分基…

linux i2c smbus驱动

目录 目录 数据收发流程 驱动层 收发接口 驱动层注册 smbus控制器 i2c控制器 协议接口使用 总体流程 数据收发关键数据结构 使用示例--eeprom的读写 使用示例--smbus的读写接口 数据收发流程 驱动层 收发接口 首先了解&#xff0c;驱动层向协议&#xff08;算法&a…

初学 SMBus

(这篇主要对象为固件工程师&#xff0c;简单介绍SMBus的一些基本概念而已) 概述 System Management Bus (简称SMBus或是SMB) &#xff0c;是1995年由Intel提出的&#xff0c;用来访问主机板上的设备(EEPROM、温度感测器、电压感测器等) 并收集相应的资讯(SPD、温度、电压、版…

SMBus协议

SMBus协议 文章目录 SMBus协议参考资料&#xff1a;一、 SMBus是I2C协议的一个子集二、 SMBus协议分析2.1 symbols(符号)2.2 SMBus Quick Command2.3 SMBus Receive Byte2.4 SMBus Send Byte2.5 SMBus Read Byte2.6 SMBus Read Word2.7 SMBus Write Byte2.8 SMBus Write Word2.…

系统管理总线(SMBus)介绍

SMBus介绍 系统管理总线协议概要系统管理总线 关键标记表SMBus接口函数1. SMBus Quick Command2. SMBus接收字节函数&#xff1a;i2c_smbus_read_byte()3. SMBus发送字节函数&#xff1a;i2c_smbus_write_byte()4. SMBus读取字节函数&#xff1a;i2c_smbus_read_byte_data()5. …

SMBus学习记录

SMBus学习记录 注&#xff1a;本文基于对于smb3.0 spec的学习总结。更多时序要求需要查阅spec。 SMBus 是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总线规范。…

SMBus通信,与IIC通信的差异

SMbus总线 SMBus是System Management Bus的缩写&#xff0c;它是一种简单的串行通信总线&#xff0c;用于连接计算机上的系统管理芯片和其他设备&#xff0c;如电池、风扇、温度传感器等。SMBus是由英特尔公司开发的&#xff0c;它基于I2C总线协议&#xff0c;但是增加了一些额…

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议 一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.…

SMBUS的介绍与访问

博文是为了总结自己在bios学习上面的点点滴滴&#xff0c;并且加深印象&#xff0c;由于本人水平有限&#xff0c;难免存在不足之处&#xff0c;望指正&#xff0c;同时感谢CSDN提供的平台。本文主要介绍的是SMBUS。 1 SMBUS的简介 特点&#xff1a; SMBUS&#xff0c;System …

java完整开发环境搭建_如何搭建一个完整的Java开发环境

这篇文章主要教大家如何搭建一个完整的Java开发环境&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 作为一个Java程序员&#xff0c;配置一个java开发环境是必备的技能&#xff0c;今天给广大菜鸟初学者补上一课。环境的配置&#xff0c;大概就分三个…

1.1-java开发环境搭建

java开发环境搭建 回到第一章&#xff1a;目录 文章目录 java开发环境搭建前言一、下载jdk1.安装前检查 二、安装jdk1.安装2.配置环境变量3.验证安装 前言 本节内容是搭建java的开发环境。 分为三步&#xff1a;下载jdk&#xff1b;安装jdk&#xff1b;配置环境变量&#xff…

Windows Java开发环境搭建

1.下载安装配置 JDK 8 打开 https://developer.oracle.com/找到 Java8 下载位置&#xff0c;点击下载链接&#xff0c;下载JDK 8 下载后如下图所示&#xff0c;双击安装一直选择选择下一步 2.下载安装 Eclipse点击官网下载 Eclipse下载后就是一个压缩包&#xff0c;只需解压即…

基于Centos7的Java开发环境搭建

基于Centos7的Java服务器搭建 前提&#xff1a;Centos常用命令安装 1. 安装wget yum -y install wget2. 安装gcc yum -y install gcc1. Centos7下的防火墙操作 systemctl status firewalld # 查看防火墙状态 systemctl start firewalld # 开启防火墙 systemctl stop fi…

Java开发环境的搭建与配置

Java开发环境的搭建与配置 1、JDK、JRE、JVM的关系 2、JDK的下载&#xff1a;http://java.sun.com 3、JDK安装&#xff1a;可以自定义安装路径 4、JDK环境变量配置&#xff1a; 鼠标右击【计算机】->【属性】->【高级系统设置】->【高级】->【环境变量】 系统变…

Java开发环境搭建实践

前言 刚刚弄完python的环境搭建&#xff0c;今年打算也要好好学习Java&#xff0c;所以把Java的环境弄起来 搭建过程 jdk下载和安装 下载 官网&#xff1a;Oracle 甲骨文中国 | 云应用和云平台 打开官网 点击产品后下拉找到Java点进去。 下载Java 我就下载最新的jdk把…

程序员福音 【完整的Java开发环境搭建】 系列篇

原文地址 BY Jason 文章目录 原文地址Java开发环境搭建统一问题解决&#xff08;更新中&#xff09;1. vim常用操作命令2. 关于Linux防火墙开放端口问题 环境安装目录&#xff08;更新中&#xff09;Docker安装容器安装SSHJDK安装MySQL安装Redis安装RabbitMQ安装 Java开发环境…

Windows下Java开发环境搭建

本文以Win7操作系统解压版Eclipse安装版JDK1.7为例&#xff0c;展示如何搭建初级Java开发环境。 第一步&#xff1a;根据自己电脑的操作系统的位数选择相应版本的安装包进行安装&#xff1a; &#xff08;1&#xff09;查看自己电脑操作系统位数&#xff1a;找到“计算机”图标…