Java中如何使用Expression4j处理表达式呢?
下文笔者讲述使用Expression4j处理表达式的方法及示例分享
学习完本篇之后,你将掌握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();
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


