Java中如何使用Expression4j处理表达式呢?

戚薇 Java经验 发布时间:2023-06-24 14:18:45 阅读数:5719 1
下文笔者讲述使用Expression4j处理表达式的方法及示例分享
学习完本篇之后,你将掌握Expression4j的使用,如下所示

使用Expression4j的方法

1.下载相应的jar包
  Expression4j网站:
    http://expression4j.sourceforge.net/

2.创建相应的Expression对象

3.使用Expression对象
  我们即可创建相应的表达式并运行
例:Expression4j的示例
  
package test.expression4j;
 
import fr.expression4j.core.Expression;
import fr.expression4j.core.Parameters;
import fr.expression4j.core.exception.EvalException;
import fr.expression4j.core.exception.ParsingException;
import fr.expression4j.factory.ExpressionFactory;
import fr.expression4j.factory.NumberFactory;
 
public class TestSimple {
 
	public static void main(String[] args) {
		try {
			Expression exp = ExpressionFactory.createExpression("f()=2.4e-2*1000");//不能有空格
			double val = exp.evaluate(null).getRealValue();
			System.out.println("exp name:" + exp.getName());
			System.out.println("exp:" + exp);
			System.out.println("result:" + val);
			
			Expression exp2 = ExpressionFactory.createExpression("func(x,y,z)=x+y*z");
			Parameters params = ExpressionFactory.createParameters();
			params.addParameter("x", NumberFactory.createReal(1));
			params.addParameter("y", NumberFactory.createReal(2));
			params.addParameter("z", NumberFactory.createReal(3));
			double val2 = exp2.evaluate(params).getRealValue();
			System.out.println("exp2 name:" + exp2.getName());
			System.out.println("exp2:" + exp2);
			System.out.println("exp2 result:" + val2);
		} catch (ParsingException e) {
			e.printStackTrace();
		} catch (EvalException e) {
			e.printStackTrace();
		}
	}
 
}

//2.组合Demo:

package test.expression4j;
 
import fr.expression4j.core.Expression;
import fr.expression4j.core.Parameters;
import fr.expression4j.core.exception.EvalException;
import fr.expression4j.core.exception.ParsingException;
import fr.expression4j.factory.ExpressionFactory;
import fr.expression4j.factory.NumberFactory;
 
public class TestAgregated {
 
	public static void main(String[] args) {
		try {
			Expression exp1 = ExpressionFactory.createExpression("f1(x)=x*x");
			Expression exp2 = ExpressionFactory.createExpression("f2(b,a,c)=f1(b)-4*a*c");
			Parameters params = ExpressionFactory.createParameters();
			params.addParameter("b", NumberFactory.createReal(4));
			params.addParameter("a", NumberFactory.createReal(2));
			params.addParameter("c", NumberFactory.createReal(2));
			double val = exp2.evaluate(params).getRealValue();
			System.out.println("exp2 name:" + exp2.getName());
			System.out.println("exp2:" + exp2);
			System.out.println("exp2 result:" + val);
		} catch (ParsingException e) {
			e.printStackTrace();
		} catch (EvalException e) {
			e.printStackTrace();
		}
	} 
}

//3.预定义函数Demo:

package test.expression4j;
 
import fr.expression4j.core.Expression;
import fr.expression4j.core.exception.EvalException;
import fr.expression4j.core.exception.ParsingException;
import fr.expression4j.factory.ExpressionFactory;
 
public class TestPredefined {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		abs(x)		绝对值
//		acos(x)		反余弦值
//		asin(x)		反正弦值
//		atan(x)		反正切
//		ceil(x)		向上取整
//		cos(x)		余弦
//		cosh(x)		双曲余弦
//		exp(x)		e的x次幂
//		floor(x)	向下取整
//		log(x)		对数
//		random()	随机数
//		sin(x)		正弦
//		sinh(x)		双曲正弦
//		sqrt(x)		平方根
//		tan(x)		正切
		try {
			Expression exp1 = ExpressionFactory.createExpression("f()=random()");
			double val = exp1.evaluate(null).getRealValue();
			System.out.println("result:" + val);
		} catch (ParsingException e) {
			e.printStackTrace();
		} catch (EvalException e) {
			e.printStackTrace();
		}
	} 
}

//4.用户定义函数Demo:

package test.expression4j;
 
import java.util.list;
import java.util.Map;
import java.util.Properties;
 
import fr.expression4j.basic.MathematicalElement;
import fr.expression4j.basic.MathematicalException;
import fr.expression4j.basic.OperatorManager;
import fr.expression4j.core.Catalog;
import fr.expression4j.core.Expression;
import fr.expression4j.core.Parameters;
import fr.expression4j.core.exception.EvalException;
import fr.expression4j.core.exception.ParametersException;
import fr.expression4j.core.exception.ParsingException;
import fr.expression4j.core.predefine.AbstractFunction;
import fr.expression4j.factory.ExpressionFactory;
import fr.expression4j.factory.NumberFactory;
import fr.expression4j.util.ParameterUtil;
 

public class TestUserDefine {
 
	public static void main(String[] args) {
		try {
			Catalog catalog = ExpressionFactory.getCatalog();
			catalog.addExpression(new MyFun());
			Expression exp = ExpressionFactory.createExpression("f()=abcd(13)");
			double val = exp.evaluate(null).getRealValue();
			System.out.println("result:" + val);
		} catch (ParsingException e) {
			e.printStackTrace();
		} catch (EvalException e) {
			e.printStackTrace();
		}
	}
 
}
 
class MyFun extends AbstractFunction {
 
	@Override
	public MathematicalElement evaluate(Parameters arg0) throws EvalException {
		try {
			double d = arg0.getParameter("x").getRealValue();//似乎只能是x一个
			return NumberFactory.createReal(d + 1);
		} catch (ParametersException e) {
			throw new EvalException("error");
		}
	}
 
	@Override
	public MathematicalElement evaluate(OperatorManager arg0, Parameters arg1) throws EvalException {
		return evaluate(arg1);
	}
 
	@Override
	public Catalog getCatalog() {
		return ExpressionFactory.getCatalog();
	}
 
	@Override
	public String getName() {
		return "abcd";//方法名
	}
 
	@Override
	public List getParameters() {
		return ParameterUtil.generateXParameters();
	}
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16875875736876.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者