Aviator使用

本文介绍了Aviator的使用示例,并详细讲解了如何进行自定义函数的扩展,帮助读者深入理解并应用Aviator表达式引擎。

使用示例如下

package com.zyy.tyy.zyytyy.test;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import com.googlecode.aviator.runtime.type.AviatorFunction;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zhouyang
 * @date 2021/8/5 10:31
 * @Version 1.0
 */

public class TestAviator {
    public static void main(String[] args) {
        /**
         * 执行表达式
         *
         * 支持大部分运算操作符(算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符、三元表达式)
         * 并且支持操作符的优先级和括号强制优先级
         */
        String expression1 = "8.29 <= 8.29 && 9.388 >= 9.388";
        System.out.println(expression1 + " = " + AviatorEvaluator.execute(expression1));

        /**
         * 使用变量(默认值是 null)
         *
         * 下面例子中的 'my name is: ' 是一个 Aviator 的 String
         */
        Map<String, Object> env = new HashMap<>();
        env.put("name", "zyy");
        System.out.println(AviatorEvaluator.execute("'my name is: ' + name", env));

        /**
         * exec 方法,可以更方便的传入变量并执行,而不需要 env 这个 map 了,不过该方法已过期,还是使用 env 的方式比较好
         */
        String myName = "zyy";
        System.out.println(AviatorEvaluator.exec("'exec my name is: ' + name", myName));

        /**
         * 调用函数
         */
        String function = "string.length('hello')";
        System.out.println(function + " = " + AviatorEvaluator.execute(function));

        /**
         * 自定义函数,要实现 AviatorFunction 接口,并注册到 AviatorEvaluator 中
         *
         * AviatorFunction 接口十分强大,通常不需要实现所有的方法,
         * 只需要根据方法的参数个数继承 AbstractFunction 类并 override 相应方法即可
         */
        AviatorEvaluator.addFunction(new TestAviatorAddFunction());
        System.out.println("self function: " + AviatorEvaluator.execute("add(614, 1001)"));
        // 注册函数通过 addFunction,移除函数通过 removeFunction
        AviatorEvaluator.removeFunction("add");

        /**
         * 编译表达式
         *
         * 可以自己先编译表达式,返回一个编译结果,然后传入不同的 env 来复用编译结果,提高性能,这是更推荐的方式
         */
        String expression2 = "a - (b - c) > 3";
        // 编译表达式
        Expression exp = AviatorEvaluator.compile(expression2);
        Map<String, Object> env2 = new HashMap<>();
        env2.put("a", 6.14);
        env2.put("b", 10.01);
        env2.put("c", 6.14);
        boolean execute = (boolean) exp.execute(env2);
        System.out.println(execute);
    }
}

自定义函数

package com.zyy.tyy.zyytyy.test;

import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.function.FunctionUtils;
import com.googlecode.aviator.runtime.type.AviatorDouble;
import com.googlecode.aviator.runtime.type.AviatorObject;

import java.util.Map;

/**
 * @author zhouyang
 * @date 2021/8/5 11:25
 * @Version 1.0
 */
public class TestAviatorAddFunction extends AbstractFunction {

    @Override
    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
        Number left = FunctionUtils.getNumberValue(arg1, env);
        Number right = FunctionUtils.getNumberValue(arg2, env);
        return new AviatorDouble(left.doubleValue() + right.doubleValue());
    }

    @Override
    public String getName() {
        return "add";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值