---
schema_version: "1"
id: 729216a321e16d70fe12eaf11d68d285e426c29ea2bd92c2434ea577a2386c9a
title: Work with Functions and Lambdas in DataWeave
collection: mulesoft
version: current
locale: en-us
portal_url: https://docs.salesforce.com/mulesoft/current/en-us/dataweave/2.6/dataweave-functions-lambdas.md
canonical_url: https://docs.mulesoft.com/dataweave/2.6/dataweave-functions-lambdas
source_site: docs.mulesoft.com
content_type: documentation
content_hash: dcd9f8e0a4572c007b90db00de7ac08b7618cde2a015dbf8612028cac2f12d6a
description: MuleSoft Documentation Site
release: "2.6"
latest: false
---
---
product: DataWeave
version: 2.6
keywords: studio, anypoint, esb, transform, transformer, format, aggregate, rename, split, filter convert, xml, json, csv, pojo, java object, metadata, dataweave, data weave, datamapper, dwl, dfl, dw, output structure, input structure, map, mapping
---

# Work with Functions and Lambdas in DataWeave

> For the full documentation index, see: https://docs.mulesoft.com/llms.txt

In DataWeave, functions and lambdas (anonymous functions) can be passed as values or be assigned to
variables.

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

```json
{
  "field1": "Annie",
  "field2": "Point",
  "field3": "Stuff"
}
```

Transform

```dataweave
%dw 2.0
output application/json
fun toUser(obj) = {
  firstName: obj.field1,
  lastName: obj.field2
}
---
{
  "user" : toUser(payload)
}
```

Output

```json
{
  "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

```json
{
  "measures": [1, 2, 4, 1, 5, 2, 3, 3]
}
```

Transform

```dataweave
%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

```linenums
{
  "max": 5
}
```

## Assign a Lambda to a Var

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

Input

```json
{
  "field1": "Annie",
  "field2": "Point",
  "field3": "Stuff"
}
```

Transform

```dataweave
%dw 2.0
output application/json
var toUser = (user) -> {
  firstName: user.field1,
  lastName: user.field2
}
---
{
  "user" : toUser(payload)
}
```

Output

```json
{
  "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

```dataweave
%dw 2.0
output application/json
var names = ["john", "peter", "matt"]
---
users: names map((name) -> upper(name))
```

Transform

```json
{
  "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

```dataweave
%dw 2.0
output application/json
var names = ["john", "peter", "matt"]
---
users: names map upper($)
```

Output

```json
{
  "users": ["JOHN", "PETER", "MATT"]
}
```

## See Also

[Supported Data Formats](https://docs.mulesoft.com/dataweave/2.6/dataweave-formats)

[DataWeave Scripts](https://docs.mulesoft.com/dataweave/2.6/dataweave-language-introduction)
