expression4J 数学公式计算
在学习解释器模式的时候,其用使用场景很少。对于数字的公式计算,可以用 expression4J来替代。
Expression4J
Expression4J下载
Expression4J 引用的jar包下载
下载下来后,进行解压,需要引用里面的lib下的jar包:
因为maven库没有该内容,所以使用的时候,需要手动引入。
代码
import fr.expression4j.basic.MathematicalElement;
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 Expression4jTest {
public static void main (String[] args) throws ParsingException, EvalException {
Expression expression = ExpressionFactory.createExpression("f(a,b,c)=a*b*c");
System.out.println("Expression name: " + expression.getName());
System.out.println("Expression parameters: " + expression.getParameters());
MathematicalElement element_a = NumberFactory.createReal(3);
MathematicalElement element_b = NumberFactory.createReal(4);
MathematicalElement element_c = NumberFactory.createReal(5);
Parameters parameters = ExpressionFactory.createParameters();
parameters.addParameter("a", element_a);
parameters.addParameter("b", element_b);
parameters.addParameter("c", element_c);
MathematicalElement evaluate = expression.evaluate(parameters);
System.out.println("Expression result: " + evaluate.getValue());
}
}
结果:
Expression name: f
Expression parameters: [a, b, c]
Expression result: 60.0
在工作中用expression4J就显得繁琐,实际中更多用SpringEL来处理字符串中数值的计算:
SpringEL
Gradle 引用springEL: spring-expression
compile 'org.springframework:spring-expression:5.2.6.RELEASE'
代码:
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class CalcuteExpl {
public static void main(String[] args) {
testCalcuteOperators();
}
public static void testCalcuteOperators() {
ExpressionParser parser = new SpelExpressionParser();
//算术运算
int two = parser.parseExpression("(1 + 1)*13").getValue(Integer.class);
System.out.println("1 + 1: " + two);
Object three = parser.parseExpression("(125 - 3 + 1)/13").getValue();
System.out.println("1 + 1: " + three);
int four = parser.parseExpression("1 - (0-3)").getValue(Integer.class);
System.out.println("1 - -3: " + four);
}
}
结果:
1 + 1: 26
1 + 1: 9
1 - -3: 4
总结:
有空好好看看expression4J的源码,学里面的思想。至于工作中更多用SpringEL,简洁方便。