Contact Us 1-800-596-4880

Work with Functions and Lambdas in DataWeave

In DataWeave, functions and lambdas (anonymous functions) can be passed as values or be assigned to variables. Before you begin, note that 2.x versions of DataWeave are used by Mule 4 apps. For DataWeave in Mule 3 apps, refer to the DataWeave version 1.2 documentation. For other Mule versions, you can use the version selector in the DataWeave table of contents.

When using lambdas within the body of a DataWeave file in conjunction with an function such as map, its attributes can either be explicitly named or left anonymous, in which case they can be referenced as $, $$, etc.

Declare and Invoke a Function

You can declare a function in the header or body of a DataWeave script by using the fun keyword. Then you can invoke the function at any point in the body of the script.

You refer to functions using this form: functionName() or functionName(arg1, arg2, argN)

You can pass an expression in between the parentheses for each argument. Each expression between the parentheses is evaluated, and the result is passed as an argument used in the execution of the function body.

Input
{
  "field1": "Annie",
  "field2": "Point",
  "field3": "Stuff"
}
Transform
%dw 2.0
output application/json
fun toUser(obj) = {
  firstName: obj.field1,
  lastName: obj.field2
}
---
{
  "user" : toUser(payload)
}
Output
{
  "user": {
    "firstName": "Annie",
    "lastName": "Point"
  }
}

Specify Type Parameters

Starting in DataWeave syntax version 2.5, you can specify the type parameters of a function at the call site.

Input
{
  "measures": [1,2,4,1,5,2,3,3]
}
Transform
%dw 2.5
output application/json

fun max<T>(elems: Array<T>): T = elems reduce ((candidate: T, currentMax = elems[0]) -> if (candidate > currentMax) candidate else currentMax)
---
{
  max: max<Number>(measures)
}
Output
{
  "max": 5
}

Assign a Lambda to a Var

You can define a function as a variable with a constant directive through var

Input
{
  "field1": "Annie",
  "field2": "Point",
  "field3": "Stuff"
}
Transform
%dw 2.0
output application/json
var toUser = (user) -> {
  firstName: user.field1,
  lastName: user.field2
}
---
{
  "user" : toUser(payload)
}
Output
{
  "user": {
    "firstName": "Annie",
    "lastName": "Point"
  }
}

Use Named Parameters in a Lambda

This example uses a lambda with an attribute that is explicitly named as name.

Input
%dw 2.0
output application/json
var names = ["john", "peter", "matt"]
---
users: names map((name) -> upper(name))
Transform
{
  "users": ["JOHN","PETER","MATT"]
}

Use Anonymous Parameters in a Lambda

This example uses a lambda with an attribute that’s not explicitly named, and so is referred to by default as $.

Transform
%dw 2.0
output application/json
var names = ["john", "peter", "matt"]
---
users: names map upper($)
Output
{
  "users": ["JOHN","PETER","MATT"]
}