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

1. 简单使用
1. 简单计算
private static void calculate() {
// 算数运算
FelEngine fel = new FelEngineImpl();
Object result = fel.eval("1.5898*1+75");
System.out.println(result);
// 逻辑运算
Object result2 = fel.eval("1 == 2 || '1'.equals('1')");
System.out.println(result2);
}
结果:
76.5898
true
2. 变量用法
private static void variables() {
// 变量
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
ctx.set("单价", 1.5898);
ctx.set("数量", 1);
ctx.set("运费", 75);
Object result = fel.eval("单价*数量+运费");
System.out.println(result);
}
结果:
76.5898
3. 访问对象的方法
private static void object() {
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
User user = new User(1, "qqq", "中国北京");
ctx.set("user", user);
Map<String, String> map = new HashMap<String, String>();
map.put("name", "qqq");
ctx.set("map", map);
// 调用user.getName()方法。
System.out.println(fel.eval("user.name"));
// map.name会调用map.get("name");
System.out.println(fel.eval("map.name"));
}
qqq
qqq
例如:访问StringUtils方法的第一种方式
private static void method() {
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
ctx.set("out", System.out);
ctx.set("StringUtils", new StringUtils());
Object eval = fel.eval("out.println('Hello Everybody'.substring(6))");
Object eval2 = fel.eval("StringUtils.isEmpty('')");
System.out.println(eval);
System.out.println(eval2);
}
4. 访问静态方法
访问StringUtils的方法:
private static void staticMethod() {
// 调用Math.min(1,2)
Object eval = FelEngine.instance.eval("$('Math').min(1,2)");
System.out.println(eval);
// 调用Stringutils的方法
Object eval1 = FelEngine.instance.eval("$('org.apache.commons.lang.StringUtils').isEmpty('123')");
System.out.println(eval1);
}
结果:
1
false
注意:如果不加包名会默认调用java.lang包下的,即使类是默认包的也会访问java.lang包的,所以最好加包名。
5. 访问集合
private static void collections() {
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));
// List
List<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));
// Map
Map<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));
}
2. 高级用法
1. 编译运行
private static void compile() {
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
ctx.set("单价", 1.5898);
ctx.set("数量", 1);
ctx.set("运费", 75);
Expression exp = fel.compile("单价*数量+运费", ctx);
Object result = exp.eval(ctx);
System.out.println(result);
}
结果:
76.5898
2. 自定义context
private static void myContext() {
FelContext ctx = new AbstractContext() {
@Override
public Object get(String arg0) {
System.out.println(arg0);
return "111222";
}
};
FelEngine fel = new FelEngineImpl(ctx);
Object eval = fel.eval("天气 + 温度");
System.out.println(eval);
}
结果:
天气
温度
111222111222
3. 自定义函数
private static void newFun() {
// 定义hello函数
Function fun = new CommonFunction() {
public String getName() {
return "hello";
}
@Override
public 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(23, 'fel', 1)";
// 解释执行
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);
}
结果:
hello 23
hello 23
FEL表达式的用法的更多相关文章
- SQL进阶1:case表达式的用法示例
一:case表达式的用法 1.SQL中的case表达式的作用是用来对"某个变量"进行某种转化,通常在select字句中使用,举个例子: 不能看出,case表达式很像我们的if el ...
- python lambda表达式简单用法【转】
python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...
- cron表达式的用法 【比较全面靠谱】
转: cron表达式的用法 cron表达式通过特定的规则指定时间,用于定时任务,本文简单记录它的部分语法和实例,并不完全,能覆盖日常大部分需求. 1. 整体结构 cron表达式是一个字符串,分为6或7 ...
- struts2中#,$,%的用法以及el,ognl表达式的用法
OGNL, JSTL, STRUTS2标签中符号#,$,%的用法示例 取Session中的值 <c:out value="${sessionScope.user.userId}&quo ...
- Fel表达式实践
项目背景 订单完成后,会由交易系统推送实时MQ消息给订单清算系统,告诉清算系统此订单交易完成,可以进行给商家结算等后续操作. 财务要求在交易推送订单到清算系统时和订单清算系统接收到订单消息后,需要按照 ...
- Fel表达式使用过程中需要注意的问题
精度问题: 我们知道java中直接使用float和double参与的计算都可能会产生精度问题,比如0.1+0.3.1.0-0.9 等.所以一般财务系统,都会使用BigDecimal进行加减乘除. 在调 ...
- Fel表达式计算引擎学习
转载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是 ...
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- (备忘)cron表达式的用法
一.结构 cron表达式用于配置cronTrigger的实例,实现任务调度的功能. Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格 ...
随机推荐
- 【转载】C#使用typeof运算符获取对象变量的具体类型Type
在C#的实际类型操作过程中,有时候需要通过typeof方法获取对象的类型对应的Type变量即具体类型,例如在获取DataTable中某一列的具体数据类型的时候,我们就会用到typeof方法来获取具体的 ...
- thinkphp路由配置route.php
路由设置配置 打开route.php 引入Route控制器类(use think\Route;) 设置路由--> Route::rule('路由表达式','路由地址','请求类型','路由参 ...
- 集成学习-Majority Voting
认识 集成学习(Ensemble Methods), 首先是一种思想, 而非某种模型, 是一种 "群体决策" 的思想, 即对某一特定问题, 用多个模型来进行训练. 像常见的单个模型 ...
- MySQL数据库(二)--库相关操作、表相关操作(1)、存储引擎、数据类型
一.库相关操作 1.创建数据库 (1)语法 create database 数据库 charset utf8; (2)数据库命名规范 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用 ...
- windows 运行库与dll文件
Windows 10包含版本 win10家庭版win10专业版win10教育版win 10企业版 Windows 7包含6个版本分别为Windows 7 Starter(初级版)Windows 7 H ...
- JPA 基础
JPA 基础 数据库驱动 ==> JDBC 规范 ==> ORM 框架 ==> JPA 规范 ==> spring-data-jpa ORM 思想 JPA 的使用步骤 jpa ...
- btcWallet系列之一-grpc模块
btcwallet对外服务 btcwallet除了像btcd对外提供rpc服务以外,还提供了grpc服务,同时grpc采用的是protobuf来实现. 这方便与不同语言进行交互,降低客户端代码编写量. ...
- 【Matplotlib】使用速记
[持续更新] pyplot matplotlib.pyplot is a state-based interface to matplotlib. It provides a MATLAB-like ...
- Splay的基本操作(插入/删除,查询)
Splay的基本操作(插入/删除,查询) 概述 这是一棵二叉查找树 让频繁访问的节点尽量靠近根 将查询,插入等操作的点"旋转"至根 树的高度均摊为$log_n$ 变量 int ro ...
- [PHP] windows下tee指令
在win下使用tee指令 tee为Linux指令,tee把日志输出到log的同时输出到屏幕. 在 http://sourceforge.net/projects/unxutils/?source=dl ...