Skip to main content

Built-in Functions

Expresso provides a variety of built-in functions to help you perform common operations in your expressions. Each function is documented with its parameter types and return type.

String Functions

FunctionDescriptionParametersReturn Type
length(str)Returns the length of a stringstr: StringInteger
upperCase(str)Converts string to uppercasestr: StringString
lowerCase(str)Converts string to lowercasestr: StringString
substring(str, start, [length])Gets a substringstr: String, start: Number, length: Number (optional)String
replace(str, old, new)Replaces text in a stringstr: String, old: String, new: StringString
trim(str)Removes whitespace from stringstr: StringString
contains(str, search)Checks if string contains textstr: String, search: StringBoolean
startsWith(str, prefix)Checks if string starts with textstr: String, prefix: StringBoolean
endsWith(str, suffix)Checks if string ends with textstr: String, suffix: StringBoolean
split(str, delimiter)Splits string into a liststr: String, delimiter: StringList<String>
join(delimiter, elements)Joins list elements into a stringdelimiter: String, elements: ListString
charAt(str, index)Gets character at indexstr: String, index: NumberString
indexOf(str, search)Gets position of substringstr: String, search: StringInteger

Math Functions

FunctionDescriptionParametersReturn Type
abs(num)Absolute valuenum: NumberNumber
ceil(num)Rounds up to nearest integernum: NumberNumber
floor(num)Rounds down to nearest integernum: NumberNumber
round(num, [decimals])Rounds to nearest integer or decimal placesnum: Number, decimals: Number (optional)Number
max(a, b)Maximum valuea: Number, b: NumberNumber
min(a, b)Minimum valuea: Number, b: NumberNumber
pow(base, exponent)Power functionbase: Number, exponent: NumberNumber
sqrt(num)Square rootnum: NumberNumber
random()Random number between 0 and 1noneNumber
sin(angle)Sine of angle (in radians)angle: NumberNumber
cos(angle)Cosine of angle (in radians)angle: NumberNumber
tan(angle)Tangent of angle (in radians)angle: NumberNumber
log(value)Natural logarithmvalue: NumberNumber
log10(value)Base-10 logarithmvalue: NumberNumber
exp(value)e raised to the powervalue: NumberNumber

Logic Functions

FunctionDescriptionParametersReturn Type
isNull(value)Checks if value is nullvalue: AnyBoolean
coalesce(value1, value2, ...)Returns first non-null valuevalue1: Any, value2: Any, ...Any
isEmpty(value)Checks if value is emptyvalue: AnyBoolean
isNumber(value)Checks if value is a numbervalue: AnyBoolean
isString(value)Checks if value is a stringvalue: AnyBoolean
isBoolean(value)Checks if value is booleanvalue: AnyBoolean
isList(value)Checks if value is a listvalue: AnyBoolean
isMap(value)Checks if value is a mapvalue: AnyBoolean
equals(value1, value2)Checks if values are equalvalue1: Any, value2: AnyBoolean
ifThen(condition, trueValue, falseValue)Conditional operatorcondition: Boolean, trueValue: Any, falseValue: AnyAny

Comparison Functions

FunctionDescriptionParametersReturn Type
greaterThan(a, b)Checks if a > ba: Number/String/Date, b: Number/String/DateBoolean
lessThan(a, b)Checks if a < ba: Number/String/Date, b: Number/String/DateBoolean
greaterThanOrEqual(a, b)Checks if a >= ba: Number/String/Date, b: Number/String/DateBoolean
lessThanOrEqual(a, b)Checks if a <= ba: Number/String/Date, b: Number/String/DateBoolean
strictEquals(a, b)Checks if a equals b (strict type check)a: Any, b: AnyBoolean
notEquals(a, b)Checks if a is not equal to ba: Any, b: AnyBoolean

Note: In addition to comparison functions, you can now use logical operators (&&, ||, !) directly in expressions for boolean operations. These operators treat null values as false.

Date Functions

FunctionDescriptionParametersReturn Type
format(date, pattern)Format datedate: LocalDate, pattern: StringString
parseDate(str, pattern)Parse date stringstr: String, pattern: StringLocalDate
now()Get current datenoneLocalDate
addDays(date, days)Add days to datedate: LocalDate, days: NumberLocalDate
dateDiff(date1, date2)Get days between datesdate1: LocalDate, date2: LocalDateNumber
addMonths(date, months)Add months to datedate: LocalDate, months: NumberLocalDate
addYears(date, years)Add years to datedate: LocalDate, years: NumberLocalDate
year(date)Get year from datedate: LocalDateNumber
month(date)Get month from datedate: LocalDateNumber
dayOfMonth(date)Get day of month from datedate: LocalDateNumber

Collection Functions

FunctionDescriptionParametersReturn Type
size(collection)Get size of collection, string, or mapcollection: List/Map/StringNumber
first(list)Get first element of listlist: ListAny
last(list)Get last element of listlist: ListAny
subList(list, start, [end])Get subset of listlist: List, start: Number, end: Number (optional)List
contains(collection, item)Check if collection contains itemcollection: List/Array/String, item: AnyBoolean

The contains function works with different types of collections:

// With strings
contains("hello world", "world") // true
contains("hello world", "bye") // false

// With lists
List<String> fruits = Arrays.asList("apple", "banana", "cherry");
context.setVariable("fruits", fruits);
contains($fruits, "banana") // true
contains($fruits, "kiwi") // false

// With arrays
Integer[] numbers = {1, 2, 3, 4, 5};
context.setVariable("numbers", numbers);
contains($numbers, 3) // true
contains($numbers, 10) // false

// With null values
contains($fruits, null) // false if there are no null elements
contains(null, "anything") // false

The contains function also handles numeric equality appropriately:

// Numeric comparisons in contains
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
context.setVariable("numbers", numbers);
contains($numbers, 3) // true for exact match
contains($numbers, 3.0) // true - numbers are compared by value, not type

// Similarly, an array of integers will find a double value if numerically equal
Integer[] numbersArray = {1, 2, 3, 4, 5};
context.setVariable("numbersArray", numbersArray);
contains($numbersArray, 3.0) // true

Utility Functions

FunctionDescriptionParametersReturn Type
typeof(value)Get type of valuevalue: AnyString
toString(value)Convert value to stringvalue: AnyString
toNumber(value)Convert value to numbervalue: AnyNumber
toBoolean(value)Convert value to booleanvalue: AnyBoolean

Custom Functions

You can register your own custom functions with the evaluator:

// Register a simple custom function
evaluator.registerFunction("add", (args) -> {
double x = ((Number) args[0]).doubleValue();
double y = ((Number) args[1]).doubleValue();
return x + y;
});

// Use the custom function in expressions
add(5, 10) // Returns: 15.0

// Register a function with string manipulation
evaluator.registerFunction("greet", (args) -> {
String name = (String) args[0];
String time = (String) args[1];
return "Good " + time + ", " + name + "!";
});

// Use the custom function
greet('Alice', 'morning') // Returns: "Good morning, Alice!"

// Register a function with multiple arguments
evaluator.registerFunction("calculate", (args) -> {
double x = ((Number) args[0]).doubleValue();
double y = ((Number) args[1]).doubleValue();
double z = ((Number) args[2]).doubleValue();
return (x + y) * z;
});

// Use the custom function
calculate(2, 3, 6) // Returns: 30.0

// Register a function with variable arguments
evaluator.registerFunction("sum", (args) -> {
double sum = 0;
for (Object arg : args) {
sum += ((Number) arg).doubleValue();
}
return sum;
});

// Use the custom function
sum(1, 2, 3, 4, 5) // Returns: 15.0

// Register a function with type conversion
evaluator.registerFunction("concat", (args) -> {
StringBuilder result = new StringBuilder();
for (Object arg : args) {
result.append(String.valueOf(arg));
}
return result.toString();
});

// Use the custom function
concat(1, 2, 3, true) // Returns: "123true"

// Register a function with null handling
evaluator.registerFunction("safeLength", (args) -> {
String str = (String) args[0];
return str != null ? str.length() : 0;
});

// Use the custom function
safeLength(null) // Returns: 0
safeLength("hello") // Returns: 5

// Register a function with complex logic
evaluator.registerFunction("grade", (args) -> {
double score = ((Number) args[0]).doubleValue();
if (score >= 90) return "A";
if (score >= 80) return "B";
if (score >= 70) return "C";
if (score >= 60) return "D";
return "F";
});

// Use the custom function
grade(95) // Returns: "A"
grade(85) // Returns: "B"
grade(75) // Returns: "C"
grade(65) // Returns: "D"
grade(55) // Returns: "F"

Custom functions can:

  • Take any number of arguments
  • Return any type of value
  • Access context variables
  • Handle various numeric types using Number.doubleValue()
  • Process null values safely
  • Throw custom exceptions
  • Perform complex calculations and type conversions