JavaDemo——表达式处理Expression4j

Expression4j网站:http://expression4j.sourceforge.net/

下载jar包

 

1.简单Demo:

  1. /**
  2. *
  3. */
  4. package test.expression4j;
  5. import fr.expression4j.core.Expression;
  6. import fr.expression4j.core.Parameters;
  7. import fr.expression4j.core.exception.EvalException;
  8. import fr.expression4j.core.exception.ParsingException;
  9. import fr.expression4j.factory.ExpressionFactory;
  10. import fr.expression4j.factory.NumberFactory;
  11. /**
  12. * @author XWF
  13. *
  14. */
  15. public class TestSimple {
  16. /**
  17. * @param args
  18. */
  19. public static void main(String[] args) {
  20. try {
  21. Expression exp = ExpressionFactory.createExpression("f()=2.4e-2*1000");//不能有空格
  22. double val = exp.evaluate(null).getRealValue();
  23. System.out.println("exp name:" + exp.getName());
  24. System.out.println("exp:" + exp);
  25. System.out.println("result:" + val);
  26. Expression exp2 = ExpressionFactory.createExpression("func(x,y,z)=x+y*z");
  27. Parameters params = ExpressionFactory.createParameters();
  28. params.addParameter("x", NumberFactory.createReal(1));
  29. params.addParameter("y", NumberFactory.createReal(2));
  30. params.addParameter("z", NumberFactory.createReal(3));
  31. double val2 = exp2.evaluate(params).getRealValue();
  32. System.out.println("exp2 name:" + exp2.getName());
  33. System.out.println("exp2:" + exp2);
  34. System.out.println("exp2 result:" + val2);
  35. } catch (ParsingException e) {
  36. e.printStackTrace();
  37. } catch (EvalException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

结果:

2.组合Demo:

  1. /**
  2. *
  3. */
  4. package test.expression4j;
  5. import fr.expression4j.core.Expression;
  6. import fr.expression4j.core.Parameters;
  7. import fr.expression4j.core.exception.EvalException;
  8. import fr.expression4j.core.exception.ParsingException;
  9. import fr.expression4j.factory.ExpressionFactory;
  10. import fr.expression4j.factory.NumberFactory;
  11. /**
  12. * @author XWF
  13. *
  14. */
  15. public class TestAgregated {
  16. /**
  17. * @param args
  18. */
  19. public static void main(String[] args) {
  20. try {
  21. Expression exp1 = ExpressionFactory.createExpression("f1(x)=x*x");
  22. Expression exp2 = ExpressionFactory.createExpression("f2(b,a,c)=f1(b)-4*a*c");
  23. Parameters params = ExpressionFactory.createParameters();
  24. params.addParameter("b", NumberFactory.createReal(4));
  25. params.addParameter("a", NumberFactory.createReal(2));
  26. params.addParameter("c", NumberFactory.createReal(2));
  27. double val = exp2.evaluate(params).getRealValue();
  28. System.out.println("exp2 name:" + exp2.getName());
  29. System.out.println("exp2:" + exp2);
  30. System.out.println("exp2 result:" + val);
  31. } catch (ParsingException e) {
  32. e.printStackTrace();
  33. } catch (EvalException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

结果:

3.预定义函数Demo:

  1. /**
  2. *
  3. */
  4. package test.expression4j;
  5. import fr.expression4j.core.Expression;
  6. import fr.expression4j.core.exception.EvalException;
  7. import fr.expression4j.core.exception.ParsingException;
  8. import fr.expression4j.factory.ExpressionFactory;
  9. /**
  10. * @author XWF
  11. *
  12. */
  13. public class TestPredefined {
  14. /**
  15. * @param args
  16. */
  17. public static void main(String[] args) {
  18. // abs(x) 绝对值
  19. // acos(x) 反余弦值
  20. // asin(x) 反正弦值
  21. // atan(x) 反正切
  22. // ceil(x) 向上取整
  23. // cos(x) 余弦
  24. // cosh(x) 双曲余弦
  25. // exp(x) e的x次幂
  26. // floor(x) 向下取整
  27. // log(x) 对数
  28. // random() 随机数
  29. // sin(x) 正弦
  30. // sinh(x) 双曲正弦
  31. // sqrt(x) 平方根
  32. // tan(x) 正切
  33. try {
  34. Expression exp1 = ExpressionFactory.createExpression("f()=random()");
  35. double val = exp1.evaluate(null).getRealValue();
  36. System.out.println("result:" + val);
  37. } catch (ParsingException e) {
  38. e.printStackTrace();
  39. } catch (EvalException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }

结果:

4.用户定义函数Demo:

  1. /**
  2. *
  3. */
  4. package test.expression4j;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Properties;
  8. import fr.expression4j.basic.MathematicalElement;
  9. import fr.expression4j.basic.MathematicalException;
  10. import fr.expression4j.basic.OperatorManager;
  11. import fr.expression4j.core.Catalog;
  12. import fr.expression4j.core.Expression;
  13. import fr.expression4j.core.Parameters;
  14. import fr.expression4j.core.exception.EvalException;
  15. import fr.expression4j.core.exception.ParametersException;
  16. import fr.expression4j.core.exception.ParsingException;
  17. import fr.expression4j.core.predefine.AbstractFunction;
  18. import fr.expression4j.factory.ExpressionFactory;
  19. import fr.expression4j.factory.NumberFactory;
  20. import fr.expression4j.util.ParameterUtil;
  21. /**
  22. * @author XWF
  23. *
  24. */
  25. public class TestUserDefine {
  26. /**
  27. * @param args
  28. */
  29. public static void main(String[] args) {
  30. try {
  31. Catalog catalog = ExpressionFactory.getCatalog();
  32. catalog.addExpression(new MyFun());
  33. Expression exp = ExpressionFactory.createExpression("f()=abcd(13)");
  34. double val = exp.evaluate(null).getRealValue();
  35. System.out.println("result:" + val);
  36. } catch (ParsingException e) {
  37. e.printStackTrace();
  38. } catch (EvalException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. class MyFun extends AbstractFunction {
  44. @Override
  45. public MathematicalElement evaluate(Parameters arg0) throws EvalException {
  46. try {
  47. double d = arg0.getParameter("x").getRealValue();//似乎只能是x一个
  48. return NumberFactory.createReal(d + 1);
  49. } catch (ParametersException e) {
  50. throw new EvalException("error");
  51. }
  52. }
  53. @Override
  54. public MathematicalElement evaluate(OperatorManager arg0, Parameters arg1) throws EvalException {
  55. return evaluate(arg1);
  56. }
  57. @Override
  58. public Catalog getCatalog() {
  59. return ExpressionFactory.getCatalog();
  60. }
  61. @Override
  62. public String getName() {
  63. return "abcd";//方法名
  64. }
  65. @Override
  66. public List getParameters() {
  67. return ParameterUtil.generateXParameters();
  68. }
  69. }

结果: