疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java解析表达式JEXL实现办法


 

  1. FormulaCalculator类
   
    Java代码
   
    1.package test;
   
    2.
   
    3.import java.util.Map;
   
    4.
   
    5.import org.apache.commons.jexl.Expression;
   
    6.import org.apache.commons.jexl.ExpressionFactory;
   
    7.import org.apache.commons.jexl.JexlContext;
   
    8.
   
    9.public class FormulaCalculator {
   
    10.
   
    11.    String _formula;
   
    12.
   
    13.    JexlContext _jexlContext;
   
    14.
   
    15.    Map _varmap;
   
    16.
   
    17.    public FormulaCalculator(){
   
    18.
   
    19.        _jexlContext = new JexlContext(){
   
    20.            public Map getVars() {
   
    21.                return _varmap;
   
    22.            }
   
    23.            public void setVars(Map vars) {
   
    24.                _varmap.clear();
   
    25.                _varmap.putAll( vars );
   
    26.            }
   
    27.        };
   
    28.    }
   
    29.
   
    30.    public void setFormula(String formula) throws Exception{
   
    31.        validateFormula( formula );
   
    32.        _formula = formula;
   
    33.    }
   
    34.
   
    35.    public void setVars(Map<String, Number> vars){
   
    36.        _varmap = vars;
   
    37.    }
   
    38.
   
    39.
   
    40.    public Number calculate() throws Exception{
   
    41.        Expression e = ExpressionFactory.createExpression( _formula );
   
    42.        return (Number) e.evaluate( _jexlContext );
   
    43.    }
   
    44.
   
    45.    private void validateFormula( String formula ) throws Exception{
   
    46.        // FIXME: implementation
   
    47.    }
   
    48.}
   
    package test;
   
    import java.util.Map;
   
    import org.apache.commons.jexl.Expression;
   
    import org.apache.commons.jexl.ExpressionFactory;
   
    import org.apache.commons.jexl.JexlContext;
   
    public class FormulaCalculator {
   
    String _formula;
   
    JexlContext _jexlContext;
   
    Map _varmap;
   
    public FormulaCalculator(){
   
    _jexlContext = new JexlContext(){
   
    public Map getVars() {
   
    return _varmap;
   
    }
   
    public void setVars(Map vars) {
   
    _varmap.clear();
   
    _varmap.putAll( vars );
   
    }
   
    };
   
    }
   
    public void setFormula(String formula) throws Exception{
   
    validateFormula( formula );
   
    _formula = formula;
   
    }
   
    public void setVars(Map<String, Number> vars){
   
    _varmap = vars;
   
    }
   
    public Number calculate() throws Exception{
   
    Expression e = ExpressionFactory.createExpression( _formula );
   
    return (Number) e.evaluate( _jexlContext );
   
    }
   
    private void validateFormula( String formula ) throws Exception{
   
    // FIXME: implementation
   
    }
   
    }
     2. 测试类
   
    Java代码
   
    1.package test;
   
    2.import java.util.HashMap;
   
    3.import java.util.Map;
   
    4.
   
    5.import junit.framework.TestCase;
   
    6.
   
    7.import org.junit.Assert;
   
    8.public class FormulaCalculatorTest extends TestCase{
   
    9.
   
    10.    public void testCalculate() throws Exception{
   
    11.        String formula = "3+2";
   
    12.        FormulaCalculator cal = new FormulaCalculator();
   
    13.        cal.setFormula(formula);
   
    14.        cal.setVars(null);
   
    15.        Number n = cal.calculate();
   
    16.        Assert.assertEquals( 5, Integer.parseInt( n.toString() ));
   
    17.
   
    18.        String formula2 = "n1+n2+3";
   
    19.        cal.setFormula(formula2);
   
    20.        Map<String, Number> mapVars = new HashMap<String, Number>();
   
    21.        mapVars.put( "n1", 2);
   
    22.        mapVars.put( "n2", 3);
   
    23.        cal.setFormula( formula2);
   
    24.        cal.setVars( mapVars);
   
    25.        Number n2 = cal.calculate();
   
    26.        Assert.assertEquals(8, Integer.parseInt( n2.toString() ));
   
    27.    }
   
    28.}