# Function classification
Version requirements: v2.3 or above
Functions start with fn., such as fn.date.timestamp(), date is the category, and the gateway has built-in functions of the following categories:
- Public class fn.common
 - Date class fn.date
 - String class fn.string
 - Codec class fn.codec
 - Math fn.math
 - Data list class fn.list
 
Example:


# Reference value
Reference values are supported in functions, such as:
fn.string.concat({step1.result.channelCode},{step1.result.nonce})
{step1.result.channelCode} represents the reference value, which refers to the result of step1
fn.string.concat({step1.result.channelCode},{g.account.name})
{g.account.name} represents a reference value, which refers to the public resource "account.name". Starting with g represents a reference to a public resource.
# Nested calls
Supports multiple nested calls, such as:
fn.codec.md5(
     fn.date.add(
         fn.date.add(
             "2021-07-09 22:44:55",
             "yyyy-MM-dd HH:mm:ss",
             1, 
             fn.math.addExact(999,1)
         ),
         "yyyy-MM-dd HH:mm:ss",
         fn.math.addExact(0,1),
         1000
     )
)
fn.string.toUpperCase(
     fn.codec.sha256(
         fn.string.concat(
             {step1.result.channelCode},
             {step1.result.nonce},
             {step1.result.timestamp},
             {step1.result.appSecret}
         )
     )
)
# Public class fn.common
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.common.iif( boolean exprResult, Object truepart, Object falsepart)  |  Object | Conditional judgment function, when the first parameter is true, return the second parameters, otherwise return the third one fn.common.iif(true,1,2) returns 1  |  exprResult: reference value or return value of the function truepart: first parameter The return value when it is true falsepart The return value when the first parameter is false  | 
| fn.common.equals( Object obj1, Object obj2)  |  boolean | Determine whether two objects are equal | obj1: Object 1 obj2: Object 2  | 
| fn.common.isNull( Object obj)  |  boolean | Determine whether the object is null | obj: object | 
| fn.common.isNotNull( Object obj)  |  boolean | Determine whether the object is not null | obj: object | 
| fn.common.isBlank( String str)  |  boolean | Determine whether the string is empty | Str: string | 
| fn.common.isNotBlank( String str)  |  boolean | Determine whether the string is not empty | Str: string | 
| fn.common.isEmpty( Object obj)  |  boolean | Determine whether the object is empty, mainly used for List/Map/array/string type objects  |  obj: object | 
| fn.common.isEmpty( Object obj)  |  boolean | Determine whether the object is not empty, mainly used for  List/Map/array/string type objects  |  obj: object | 
| fn.common.and( Boolean... objs)  |  boolean | Version requirement: v2.7.1 or above and logical function  |  objs: Boolean value, multiple | 
| fn.common.or( Boolean... objs)  |  boolean | Version requirement: v2.7.1 or above or logical function  |  objs: Boolean value, multiple | 
| fn.common.not( Boolean obj)  |  boolean | Version requirement: v2.7.1 or above Non-logical function  |  obj: Boolean value | 
| fn.common.emptyList() | List | Version requirement: v2.7.3 or above Create an empty list or empty array function  |  |
| fn.common.emptyMap() | Map | Version requirement: v2.7.3 or above Create empty object function  |  
# Date class fn.date
Common date formats:
-yyyy-MM-ddHH:mm:ss
-yyyy-MM-dd
-HH:mm:ss
-HH:mm
yyyy-MM-dd HH:mm:ss Z
Other reference date format specifications
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.date.timestamp() | long | Generate the current timestamp | |
| fn.date.getTime(String date,  String pattern, String timeZone)  |  long | Get the timestamp corresponding to the date fn.date.getTime("2021-08-04" ,"yyyy-MM-dd")  |  date: date pattern: date format, timeZone: [optional] time zone, default East Eighth Zone For example: GMT+08:00  | 
| fn.date.now(String pattern, String timeZone)  |  String | Get the current time, such as getting the current date:  fn.date.now("yyyy-MM-dd")  |  pattern: Date format, Commonly used formats are: yyyy-MM-dd HH:mm:ss yyyy-MM-dd HH:mm:ss HH:mm yyyy-MM-dd HH:mm:ss Z timeZone [Optional] Time zone, default is East Eighth District For example: GMT+08:00  | 
| fn.date.add(String date,  String pattern, int field, int amount, String timeZone)  |  String | Add time to date, such as time " 2021-08-04 14:23:12"Add 5 hours: fn.date.add("2021-08-04 14:23:12", "yyyy-MM-dd HH:mm:ss", 4, 5) Get: 2021-08-04 19:23:12  |  date: date pattern: date format of the date parameter field: date field 1 for millisecond 2 for second 3 for minute 4 for hour 5 for date 6 for month 7 for year amount: time amount timeZone [optional] time zone, default East Eighth District For example: GMT+08:00  | 
| fn.date.formatTs(long timestamp,  String pattern, String timeZone)  |  String | Format timestamp to date | timestamp: timestamp pattern: target date format timeZone [Optional] Time zone, default is East Eighth District For example: GMT+08:00  | 
| fn.date.changePattern(String dateStr,  String sourcePattern, String targetPattern, String timeZone)  |  String | Convert date to another format | dateStr: date sourcePattern: date format of dateStr parameter targetPattern: target date format timeZone [optional] time zone, default East Eight Zones For example: GMT+08:00  | 
# Date format specification
| Letter | Description | Example | 
|---|---|---|
| G | Era code | AD | 
| y | year | 2018(yyyy),18(yy) | 
| M | Month | July(MMMM), Jul(MMM), 07(MM) | 
| w | The result of the week of the year | 16 | 
| W | Results for the week of the month | 3 | 
| D | Day of the year | 266 | 
| d | day | 09(dd), 9(d) | 
| F | Day of the week | 4 | 
| E | Day of the week | Tuesday, Tue | 
| u | Day of the week, where 1 represents Monday, 2 represents Tuesday, and so on | 2 | 
| a | AM or PM mark | AM | 
| H | Hour of day (0-23) | 12 | 
| k | hour of day (1-24) | 23 | 
| K | AM/PM hour in 12-hour format (0-11) | 0 | 
| h | Hour in am/pm, representing 12-hour format (1-12) | 12 | 
| m | minutes | 59 | 
| s | seconds | 35 | 
| S | milliseconds | 978 | 
| z | Time zone | Pacific Standard Time; PST; GMT-08:00 | 
| Z | Time zone offset in hours (RFC mode) | -0800 | 
| X | Time zone offset in ISO format | -08; -0800; -08:00 | 
# String class fn.string
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.string.equals(String str1, String str1)  |  Boolean | Whether str1 is equal to str2 | str1: string str2: string  | 
| fn.string.equalsIgnoreCase( String str1,tring str1)  |  Boolean | Whether str1 is equal to (not case sensitive) str2 | str1: string str2: string  | 
| fn.string.compare(String str1, String str1)  |  Int | Compare str1 and str2 Str1 is less than str2 and return -1, str1 is equal to str2 and return 0, str1 is greater than str2 and returns 1  |  str1: string str2: string  | 
| fn.string.concat(String... strs) | String | Concatenate strings, such as: fn.string.concat("a","b","c") Return: abc  |  Strs: string, multiple | 
| fn.string.concatws( String separator, String... strs)  |  String | Concatenate strings, such as: fn.string.concatws("-","a" ,"b","c") Return: a-b-c  |  separator: separator Strs: string, multiple  | 
| fn.string.substring(String str, int beginIndex, int endIndex)  |  String | Intercept string, such as: fn.string.substring("abcd",1,2)<br/ >Return: b fn.string.substring("abcd",1) Return: bcd  |  str: string beginIndex: start subscript endIndex: [optional 】End subscript  | 
| fn.string.indexOf(String str,  String substr)  |  Int | Returns the subscript of the substring, such as: fn.string.indexOf("abcd", "bd") Return: 1  |  str: string substr: substring  | 
| fn.string.startsWith(String str, String prefix)  |  Bool | Whether the string starts with the specified prefix, For example: fn.string.startsWith("abcd", "bd ") Return: 1  |  str: string prefix: prefix  | 
| fn.string.endsWith(String str,  String suffix)  |  Bool | Whether the string ends with the specified suffix, For example: fn.string.endsWith("abcd","bd") Return: 1  |  str: string suffix: suffix  | 
| fn.string.toUpperCase(String str) | String | Convert to uppercase, For example: fn.string.toUpperCase("abcd") Return: ABCD  |  str: string | 
| fn.string.toLowerCase(String str) | String | Convert to lowercase, For example: fn.string.toLowerCase("aBCd") Return: abcd  |  str: string | 
| fn.string.uuid() | String | Get UUID, such as: fn.string.uuid()  |  |
| fn.string.replace(String str,  String target, String replacement)  |  String | Replace the specified string, such as: fn.string.replace("abcd ", "bc","111") Return: a111d  |  str: string target: string to be replaced replacement: replacement string  | 
| fn.string.replaceAll(String str,  String regex, String replacement)  |  String | Replace the string matched by the regular expression,  such as: fn.string .replaceAll("abcbcd", "bc","111") Return: a111111d  |  str: string regex: regular expression used to match the string to be replaced< br/>replacement: replacement string  | 
| fn.string.replaceFirst(String str,  String regex, String replacement)  |  String | Replace the first string that matches the regular expression  , such as: fn.string.replaceFirst("abcbcd", "bc","111") Return: a111bcd  |  str: string regex: regular expression used for matching String to be replaced replacement: string to be replaced  | 
# Codec class fn.codec
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.codec.md5(String data) | String | MD5 encryption, such as: fn.codec.md5("abc") Return: 900150983cd24fb0d6963f7 d28e17f72  |  data : Data that needs to be encrypted | 
| fn.codec.sha1(String data) | String | SHA1 encryption, such as: fn.codec.sha1("abc") Return: a9993e364706816aba3e2571 7850c26c9cd0d89d  |  data : Data that needs to be encrypted | 
| fn.codec.sha256(String data) | String | SHA256 encryption, such as: fn.codec.sha256("abc")  |  data: data to be encrypted | 
| fn.codec.sha384(String data) | String | SHA384 encryption, such as: fn.codec.sha384("abc")  |  data: data to be encrypted | 
| fn.codec.sha512(String data) | String | SHA512 encryption, such as: fn.codec.sha512("abc")  |  data: data to be encrypted | 
| fn.codec.base64Encode( String data)  |  String | base64 encryption, such as: fn.codec.base64Encode( "Introduction to Base64 Encoding") Return: QmFzZTY057yW56CB5LuL57uN  |  data: data to be encrypted | 
| fn.codec.base64Decode( String data)  |  String | base64 decryption, such as: fn.codec.base64Decode( "QmFzZTY057yW56CB5LuL57uN") Return: Introduction to Base64 encoding  |  data: data to be decrypted | 
| fn.codec.aesEncrypt( String data, String key)  |  String | AES encryption, such as: fn.codec.aesEncrypt("abc", "1234567812345678")  |  data: Data to be encrypted key: key  | 
| fn.codec.aesDecrypt( String data, String key)  |  String | AES decryption, such as: fn.codec.aesDecrypt("abc", "1234567812345678")  |  data: Data to be decrypted key: key  | 
| fn.codec.desEncrypt( String data, String key)  |  String | DES encryption, such as: fn.codec.desEncrypt("abc", "123456781234567812345 67812345678 ")  |  data: data to be encrypted key: key  | 
| fn.codec.desDecrypt( String data, String key)  |  String | DES encryption, such as: fn.codec.desDecrypt("abc", "123456781234567812345 67812345678 ")  |  data: data to be decrypted key: key  | 
# Math class fn.math
Mathematics functions are divided into two categories: integers and floating point numbers. If you are not sure about the type of input parameters, you can use floating point number functions.
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.math.absExact(long a) | Long | Get the absolute value, such as: fn.math.absExact(-32) Return: 32 fn.math.absExact(5 ) Return: 5  |  a: integer | 
| fn.math.negateExact(long a) | Long | Negation, such as: fn.math.negateExact(-3) Return: 3 fn.math.negateExact(5) Return: -5  |  a: integer | 
| fn.math.addExact( long x, long y)  |  Long | Add two integers, such as: fn.math.addExact(3,2) Return: 5  |  x : integer y: integer  | 
| fn.math.subtractExact( long x, long y)  |  Long | Subtract two integers, such as: fn.math.subtractExact(3,2) Return: 1  |  x : integer y: integer  | 
| fn.math.multiplyExact( long x, long y)  |  Long | Multiply two integers, such as: fn.math.multiplyExact(3,2) Return: 6  |  x : integer y: integer  | 
| fn.math.maxExact( long x, long y)  |  Long | Take the maximum value of two integers, such as: fn.math.maxExact(3,2) Return: 3  |  x: integer y: integer  | 
| fn.math.minExact (long x, long y)  |  Long | Take the minimum value of two integers, such as: fn.math.minExact(3,2) Return: 2  |  x: integer y: integer  | 
| fn.math.mod(long x, long y) | Long | Modulo, such as: fn.math.mod(3,2) Return: 1  |  x: integer y: integer  | 
| fn.math.pow(double a,  double b)  |  double | Power, such as:  fn.math.pow(3,2) Return: 9  |  a: float Point b: Floating point number  | 
| fn.math.sqrt(double a) | double | Square root, such as: fn.math.sqrt(9) Return: 3  |  a: floating point number | 
| fn.math.random() | double | Get a random number and return a floating point number between 0 and 1 | |
| fn.math.absDecimal( double a)  |  double | Get the absolute value, such as: fn.math.absDecimal(-3.2) Return: 3.2 fn.math .absDecimal(5.1) Return: 5.1  |  a: floating point number | 
| fn.math.negateDecimal( double a)  |  double | Negation, such as: fn.math.negateDecimal(-3.2) Return: 3.2 fn.math. negateDecimal(5.2) Return: -5.2  |  a: floating point number | 
| fn.math.addDecimal( double x, double y)  |  double | Add two floating point numbers, such as: fn.math.addDecimal(3.1,2.2) Return: 5.3  |  x: floating point number y: floating point number  | 
| fn.math.subtractDecimal( double x, double y)  |  double | Subtract two floating point numbers, such as: fn.math.subtractDecimal(3.1,2.2) Return: 0.9  |  x: floating point number y: floating point number  | 
| fn.math.multiplyDecimal( double x, double y)  |  double | Multiply two floating point numbers, such as: fn.math.multiplyDecimal(3.2,2) Return: 6.4  |  x: floating point number y: floating point number  | 
| fn.math.divideDecimal( double x, double y)  |  double | Divide two floating point numbers, such as: fn.math.divideDecimal(4.2,2) Return: 2.1  |  x: floating point number y: floating point number  | 
| fn.math.maxDecimal( double x, double y)  |  double | Take the maximum value of two integers, such as: fn.math.maxDecimal(3.2,2) Return: 3.2  |  x: floating point number y: floating point number  | 
| fn.math.minDecimal( double x, double y)  |  double | Take the minimum value of two integers, such as: fn.math.minDecimal(3.2,2) Return: 2  |  x: floating point number y: floating point number  | 
| fn.math.scaleDecimal( double a, int scale)  |  double | Set the number of decimal places and round, such as: fn.math.scaleDecimal(3.236787,2) Return: 3.24  |  a: floating point number scale: number of decimal places retained  | 
| fn.math.compare( double x, double y)  |  int | Compare x and y If x is less than y, return -1, x is equal to y, return 0, x is greater than y and returns 1  |  x: floating point number y: floating point number  | 
| fn.math.equals( double x, double y)  |  Boolean | Determine whether x is equal to y | x: floating point number y: floating point number  | 
| fn.math.lt( double x, double y)  |  Boolean | Determine whether x is less than y | x: floating point number y: floating point number  | 
| fn.math.le( double x, double y)  |  Boolean | Determine whether x is less than or equal to y | x: floating point number y: floating point number  | 
| fn.math.gt( double x, double y)  |  Boolean | Determine whether x is greater than y | x: floating point number y: floating point number  | 
| fn.math.ge( double x, double y)  |  Boolean | Determine whether x is greater than or equal to y | x: floating point number y: floating point number  | 
# Data list class fn.list
| Function | Return value type | Purpose | Parameter description | 
|---|---|---|---|
| fn.list.expand( List<List<Object>> data)  |  ListList<Object> | Expand a two-dimensional array (list) into a one-dimensional array (list), For example: data=[[{a:1}],[{a:2}],[{a:3}]] fn.list.expand(data)<br/ >Return: [{a:1},{a:2},{a:3}]  |  data: two-dimensional array (list) | 
| fn.list.merge( List<Object>... data)  |  List<Object> | Merge multiple lists into one, such as: data1=[{a: 1}] data2=[{a:2}] data3=[{a:3}] fn.list.merge(data1,data2,data3) Return :[{a:1},{a:2},{a:3}]  |  data: list, can be multiple | 
| fn.list.extract( List<Map<String, Object>> data, String... fields)  |  List<Map<String, Object>> | Extract only some fields in the list, such as: data=[ {a:1,b:4,c:7}, {a:2,b:5,c :8}, {a:3,b:6,c:9} ] fn.list.extract(data, "a", "c") Return: [ {a:1,c:7}, {a:2,c:8}, {a:3,c:9} ]  |  data: list fields: [optional] fields, there can be multiple  | 
| fn.list.join( List<Map<String, Object>> dest, List<Map<String, Object>> src, String joinField, String... fields)  |  List<Map<String, Object>> | Merge 2 list fields, you can only merge specified fields, such as: dest=[ {a:1,b:4,c:7}, {a:2,b:5,c:8}, {a:3,b:6,c:9 } ] src=[ {a:1,d:444,e:777}, {a:2,d:555,e:888}<br/ />] fn.list.join(dest,src, "a", "d") Return: [ {a:1,b:4,c:7,d :444}, {a:2,b:5,c:8,d:555}, {a:3,b:6,c:9} ]  |  dest : Target list src: The merged list joinField: The field associated with the two lists Format: The associated field of the dest list: The associated field of the src list , such as: userName:uname, If the associated fields of the two lists are the same, you can fill in only one, such as: userName fields: [Optional] The fields that need to be merged in the merged list, Multiple fields are allowed. If left blank, all fields will be merged  | 
| fn.list.rename( List<Map<String, Object>> data, String... fieldPairs)  |  List<Map<String, Object>> | Rename some fields in the list, such as: data=[< br/>{a:1,b:4,c:7}, {a:2,b:5,c:8}, {a:3,b:6,c: 9} ] fn.list.rename(data, "a:apple", "c:cat") Return: [ {apple:1,b:4 ,cat:7}, {apple:2,b:5,cat:8}, {apple:3,b:6,cat:9} ]  |  data: list  fieldPairs: [Optional] The field pairs to be renamed can be multiple. Format: Original field name: New field name, such as: c:cat  | 
| fn.list.removeFields( List<Map<String, Object>> data, String... fields)  |  List<Map<String, Object>> | Delete some fields in the list, such as: data=[ {a:1,b:4,c:7}, {a:2,b:5,c: 8}, {a:3,b:6,c:9} ] fn.list.removeFields(data, "b") Return: [ {a:1,c:7}, {a:2,c:8}, {a:3,c:9} ]  |  data: list<br/ />fields: [Optional]  fields to be deleted, there can be multiple  | 
| fn.list.emptyList() | List | Version requirement: v2.7.3 or above Create an empty list or empty array function  |