Map<String, Object> env = new HashMap<>();env.put("person", new Person("movee", 25));env.put("a", 20L);Object result = AviatorEvaluator.execute("person.name", env);这样一来,aviator可以非常方便的从json字符串中提取子json字符串
String jsonStr = """ { "a": { "b": [ { "x": 3 }, { "x": 4 } ] } } """; JSONObject jsonObj = new JSONObject(jsonStr); // 结果返回 3 Object value = AviatorEvaluator.execute("a.b[0]['x']", jsonObj.toMap());使用函数aviator已经提供了很多开箱即用的函数了:
// 返回4 Long r = (Long) AviatorEvaluator.execute("math.round(4.3)"); // 返回5 Long r = (Long) AviatorEvaluator.execute("string.length('hello')"); // 返回一个ArrayList:[1,2,3] Object r = AviatorEvaluator.execute("seq.list(1,2,3)");更详细的内置函数列表请参考:aviator函数库列表
我们也可以自定义一个java函数,自己编写一个类,继承aviator的AbstractFunction类,然后实现相应的方法即可:
public class AddFunction extends AbstractFunction { /** * 函数实现的功能 * @param env 参数 * @param arg1 函数的第一个参数 * @param arg2 函数的第二个参数 * @return 返回值 */ @Override public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) { long num1 = FunctionUtils.getNumberValue(arg1, env).longValue(); long num2 = FunctionUtils.getNumberValue(arg2, env).longValue(); return AviatorLong.valueOf(num1+num2); } /** * 注册到aviator的名字 * @return 函数名字 */ @Override public String getName() { return "add"; } }然后就可以注册到aviator中,像使用内置函数一样使用自定义函数:
推荐阅读
- 八个针对高级职位的高级 JavaScript 面试题
- Java集合框架解析:选择正确数据结构提升性能
- Java 应用通过 OpenTelemetry API 实现手动埋点
- 深入浅出、玩转Java多线程
- 揭秘十个必知的 JavaScript 3D 库,打造顶级3D炫酷效果!
- 我不再写Javascript了
- 冒险岛这款手游吸引玩家的地方,就是可以尽情体验打怪升级的乐趣
- Java 单元测试及常用语句
- 构建高效的Java网络应用,体验秒级响应
- 下一代Java微服务:从Spring Boot到Quarkus的迁移指南
