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
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2018-08-13 Executor线程池的简单使用
2018-08-13 抽象类和接口的区别
2018-08-13 commons常用工具包的使用&guava工具类使用&hutool扫描类、http、加载指定jar包
2017-08-13 使用JSON语法创建JS对象(重要)