Here are some code snippets demonstrating Formula4J's API. These examples use hard-coded values, which is artificial. In general, variable values will almost always come from your application's data.

Basic Math

Formula formula = new Formula("3.5 * (6 + 3)");
Decimal answer = formula.getAnswer(); //31.5

Use Some Built-in Functions

Formula formula = new Formula("sqrt(floor(9.5))");
Decimal answer = formula.getAnswer(); // 3.0
    
formula = new Formula("median(2,5,3,6)");
answer = formula.getAnswer(); // 4
    
formula = new Formula("max(2,6,3,5)");
answer = formula.getAnswer(); // 6
    
formula = new Formula("daysbetween(2012,12,25,  2013,12,25)");
answer = formula.getAnswer(); // 365.0
    
formula = new Formula("sin(0.5)");
answer = formula.getAnswer(); // 0.479425538604203

Populate Variable Values

//formulas usually have variables 
//this is the most common use case
Map<String, Decimal> variables = new LinkedHashMap<String, Decimal>();
variables.put("a", Decimal.from(7));
variables.put("b10", Decimal.from(-6));

//note the different constructor used here, passing in the variable map:
Formula formula = new Formula("2 + a + b10", variables);
Decimal answer = formula.getAnswer(); //3

List Functions and Variables in a Formula

Formula formula = new Formula("sqrt(floor(9.5))");
List<String> functionNames = formula.getFunctionNames()); //[sqrt, floor]
  
formula = new Formula("2 + a + b10");
varNames = formula.getVariableNames()); // [a, b10]

Define a Custom Function in Text

//start with the default function map;
//it maps the name of the function, as it 
//appears in a formula, to an underlying class
Map<String, Function> customFunctions = Formula.getDefaultFunctions();

//add a new entry to the function map
Function bmi = new FunctionDefinedInText("bmi(m,h) = m/h^2");
customFunctions.put("bmi", bmi);

//some variable values
Map<String, Decimal> variables = new LinkedHashMap<String, Decimal>(); 
variables.put("m", Decimal.from(64));
variables.put("h", Decimal.from(8));

//use the new function as part of an expression
//this constructor takes 3 items 
Formula formula = new Formula("5 * bmi(m,h)", variables, customFunctions);
Decimal answer = formula.getAnswer(); // 5

Define a Custom Function in Code

//the custom function class
class Bmi implements Function {
  public Decimal calculate(Decimal... aArgs) {
    Check.numArgs(2, aArgs);
    Decimal mass = aArgs[0]; 
    Decimal height = aArgs[1]; 
    return mass.div(height.pow(2));
  }
}

...

//start with the default function map;
//it maps the name of the function, as it 
//appears in a formula, to an underlying class
Map<String, Function> customFunctions = Formula.getDefaultFunctions();

//add a new entry to the function map
Function bmi = new Bmi(); //the class above
customFunctions.put("bmi", bmi);
   
//some variable values
Map<String, Decimal> variables = new LinkedHashMap<String, Decimal>(); 
variables.put("m", Decimal.from(64));
variables.put("h", Decimal.from(8));

//use the new function as part of an expression
//this constructor takes 3 items 
Formula formula = new Formula("5 * bmi(m,h)", variables, customFunctions);
Decimal answer = formula.getAnswer(); // 5

Change the Name of a Built-In Function

//start with the default function map
Map<String, Function> customFunctions = Formula.getDefaultFunctions();

//change 'sin' to 'sine'
//first get a reference to the function object itself
Function sineFunction = customFunctions.get("sin");
    
//remove it from the map, then add it back in using the new name
customFunctions.remove(sineFunction);    
customFunctions.put("sine", sineFunction);
//this technique also lets you translate built-in 
//function names into different languages

//some variable values
Map<String, Decimal> variables = new LinkedHashMap<String, Decimal>(); 
variables.put("x", Decimal.from(0.5));
    
Formula formula = new Formula("sine(x)", variables, customFunctions);
Decimal answer = formula.getAnswer(); // 0.479425538604203