ARM 模板的 lambda 函数
本文介绍可在 ARM 模板中使用的 lambda 函数。 lambda 函数本质上可以作为参数传递的代码块。 它们可以采用多个参数,但限制为单个代码行。 在 Bicep 中,Lambda 表达式采用以下格式:
lambda(<lambda variable>, [<lambda variable>, ...], <expression>)
限制
ARM 模板 lambda 函数具有以下限制:
- Lambda 表达式只能在以下函数中直接指定为函数参数:
filter()
、groupBy()
、map()
、mapValues()
、reduce()
、sort()
和toObject()
。 - 目前不支持在资源或模块数组访问中使用 lambda 变量(lambda 函数中使用的临时变量)。
- 目前不支持在
listKeys
函数中使用 lambda 变量。 - 目前不支持在 reference 函数中使用 lambda 变量。
filter
filter(inputArray, lambda function)
借助自定义筛选函数来筛选数组。
在 Bicep 中,使用 filter 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 要筛选的数组。 |
lambda 函数 | 是 | 表达式 | 应用于每个输入数组元素的 lambda 函数。 如果为 false,该项将从输出数组中筛选出来。 |
返回值
一个数组。
示例
下面的示例展示了如何使用 filter
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"oldDogs": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('dog', greaterOrEquals(lambdaVariables('dog').age, 5)))]"
},
"dogNameIndex": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('val', 'i', and(less(lambdaVariables('i'), 2), equals(substring(lambdaVariables('val').name, 0, 1), 'C'))))]"
}
}
}
上述示例的输出:
名称 | 类型 | 值 |
---|---|---|
oldDogs | Array | [{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}] |
dogNameIndex | 数组 | [{"name":"Casper","age":3,"interests":["Other dogs"]}] |
oldDogs 列出了五岁及以上的犬;dogNameIndex 标识索引号小于 2 且名称以字母“C”开头的犬。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"copy": [
{
"name": "itemForLoop",
"count": "[length(range(0, 10))]",
"input": "[range(0, 10)[copyIndex('itemForLoop')]]"
}
]
},
"resources": [],
"outputs": {
"filteredLoop": {
"type": "array",
"value": "[filter(variables('itemForLoop'), lambda('i', greater(lambdaVariables('i'), 5)))]"
},
"isEven": {
"type": "array",
"value": "[filter(range(0, 10), lambda('i', equals(0, mod(lambdaVariables('i'), 2))))]"
}
}
}
上一示例的输出:
名称 | 类型 | 值 |
---|---|---|
filteredLoop | Array | [6, 7, 8, 9] |
isEven | Array | [0, 2, 4, 6, 8] |
filterdLoop 显示数组中大于 5 的数字;isEven 显示数组中的偶数。
groupBy
groupBy(inputArray, lambda expression)
根据分组条件,使用数组中的数组值创建一个对象。
在 Bicep 中,使用 groupBy 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 用于分组的数组。 |
lambda 表达式 | 是 | 表达式 | Lambda 表达式应用于每个输入数组元素,并根据分组条件对元素进行分组。 |
返回值
一个 对象。
示例
以下示例演示如何使用 groupBy
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputArray": [
"foo",
"bar",
"baz"
]
},
"resources": [],
"outputs": {
"outObject": {
"type": "object",
"value": "[groupBy(variables('inputArray'), lambda('x', substring(lambdaVariables('x'), 0, 1)))]"
}
}
}
上一示例中的输出显示五岁或年纪更大的狗:
名称 | 类型 | 值 |
---|---|---|
outObject | Object | {"f":["foo"],"b":["bar","baz"]} |
outObject 显示一个按数组元素的第一个字母对数组元素进行分组的对象。
map
map(inputArray, lambda function)
将自定义映射函数应用于数组的每个元素。
在 Bicep 中,使用 map 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 要映射的数组。 |
lambda 函数 | 是 | 表达式 | 将 lambda 函数应用于每个输入数组元素,以便生成输出数组。 |
返回值
一个数组。
示例
以下示例演示如何使用 map
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogNames": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').name))]"
},
"sayHi": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', format('Hello {0}!', lambdaVariables('dog').name)))]"
},
"mapArray": {
"type": "array",
"value": "[map(range(0, length(variables('dogs'))), lambda('i', createObject('i', lambdaVariables('i'), 'dog', variables('dogs')[lambdaVariables('i')].name, 'greeting', format('Ahoy, {0}!', variables('dogs')[lambdaVariables('i')].name))))]"
},
"mapArrayIndex": {
"type": "array",
"value": "[map(variables('dogs'), lambda('x', 'i', createObject('index', lambdaVariables('i'), 'val', lambdaVariables('x').name)))]"
}
}
}
前述示例的输出为:
名称 | 类型 | 值 |
---|---|---|
dogNames | Array | ["Evie","Casper","Indy","Kira"] |
sayHi | Array | ["Hello Evie!","Hello Casper!","Hello Indy!","Hello Kira!"] |
mapArray | 数组 | [{"i":0,"dog":"Evie","greeting":"Ahoy, Evie!"},{"i":1,"dog":"Casper","greeting":"Ahoy, Casper!"},{"i":2,"dog":"Indy","greeting":"Ahoy, Indy!"},{"i":3,"dog":"Kira","greeting":"Ahoy, Kira!"}] |
mapArrayIndex | 数组 | [{"index":0,"val":"Evie"},{"index":1,"val":"Casper"},{"index":2,"val":"Indy"},{"index":3,"val":"Kira"}] |
dogNames 显示对象数组中的犬名;sayHi 连接“Hello”和每个犬名;mapArray 和 mapArrayIndex 再创建两个对象数组。
mapValues
mapValues(inputObject, lambda expression)
根据输入对象创建对象,使用 Lambda 表达式来映射值。
在 Bicep 中,使用 mapValues 函数。
参数
参数 | 必选 | 类型 | 描述 |
---|---|---|---|
inputObject | 是 | 对象 (object) | 要映射的对象。 |
lambda 表达式 | 是 | 表达式 | 用于映射值的 Lambda 表达式。 |
返回值
一个对象。
示例
以下示例演示如何使用 mapValues
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputObject": {
"foo": "foo",
"bar": "bar"
}
},
"resources": [],
"outputs": {
"mapObject": {
"type": "object",
"value": "[mapValues(variables('inputObject'), lambda('val', toUpper(lambdaVariables('val'))))]"
}
}
}
前述示例的输出为:
名称 | 类型 | 值 |
---|---|---|
mapObject | Object | {foo: 'FOO', bar: 'BAR'} |
mapObject 创建另一个具有大写值的对象。
reduce
reduce(inputArray, initialValue, lambda function)
借助自定义 reduce 函数减少数组。
在 Bicep 中,使用 reduce 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 要减少的数组。 |
initialValue | 是 | any | 初始值。 |
lambda 函数 | 是 | 表达式 | 用于聚合当前值和下一个值的 lambda 函数。 |
返回值
任何。
示例
下面的示例展示了如何使用 reduce
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
],
"ages": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').age))]"
},
"resources": [],
"outputs": {
"totalAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"totalAgeAdd1": {
"type": "int",
"value": "[reduce(variables('ages'), 1, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"oddAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', 'i', if(equals(mod(lambdaVariables('i'), 2), 0), add(lambdaVariables('cur'), lambdaVariables('next')), lambdaVariables('cur'))))]"
}
}
}
前述示例的输出为:
名称 | 类型 | 值 |
---|---|---|
totalAge | int | 18 |
totalAgeAdd1 | int | 19 |
oddAge | int | 7 |
totalAge 对狗的年龄进行求和;totalAgeAdd1 的初始值为 1,并将所有狗的年龄添加到初始值。 oddAge 对偶数索引处犬的犬龄(具体为 5 (Evie) 和 2 (Indy))求和。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"reduceObjectUnion": {
"type": "object",
"value": "[reduce(createArray(createObject('foo', 123), createObject('bar', 456), createObject('baz', 789)), createObject(), lambda('cur', 'next', union(lambdaVariables('cur'), lambdaVariables('next'))))]"
}
}
}
前述示例的输出为:
名称 | 类型 | 值 |
---|---|---|
reduceObjectUnion | object | {"foo":123,"bar":456,"baz":789} |
union 函数返回包含参数中所有元素的单个对象。 函数调用将对象的键值对联合为一个新对象。
sort
sort(inputArray, lambda function)
借助自定义 sort 函数对数组进行排序。
在 Bicep 中,使用 sort 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 要排序的数组。 |
lambda 函数 | 是 | 表达式 | 用于比较两个数组元素以进行排序的 lambda 函数。 如果为 true,第二个元素将排在输出数组的第一个元素之后。 |
返回值
一个数组。
示例
以下示例演示如何使用 sort
函数。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsByAge": {
"type": "array",
"value": "[sort(variables('dogs'), lambda('a', 'b', less(lambdaVariables('a').age, lambdaVariables('b').age)))]"
}
}
}
上述示例的输出将狗对象按照从最年轻到最年长进行排序:
名称 | 类型 | 值 |
---|---|---|
dogsByAge | Array | [{"name":"Indy","age":2,"interests":["Butter"]},{"name":"Casper","age":3,"interests":["Other dogs"]},{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}] |
toObject
toObject(inputArray, lambda function, [lambda function])
通过一个自定义键函数和可选的自定义值函数将数组转换为对象。 请参阅有关将对象转换为数组的项。
在 Bicep 中,使用 toObject 函数。
参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
inputArray | 是 | array | 用于创建对象的数组。 |
lambda 函数 | 是 | 表达式 | 用于提供键谓词的 lambda 函数。 |
lambda 函数 | 否 | 表达式 | 用于提供值谓词的 lambda 函数。 |
返回值
一个对象。
示例
以下示例展示了如何将 toObject
函数与两个必需参数一起使用:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name))]"
}
}
}
前面的示例基于数组来生成对象。
名称 | 类型 | Value |
---|---|---|
dogsObject | Object | {"Evie":{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},"Casper":{"name":"Casper","age":3,"interests":["Other dogs"]},"Indy":{"name":"Indy","age":2,"interests":["Butter"]},"Kira":{"name":"Kira","age":8,"interests":["Rubs"]}} |
具有第三个参数的以下 toObject
函数提供相同的输出。
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry')))]"
}
}
以下示例展示了如何将 toObject
函数与三个参数一起使用。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"properties": {
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
}
},
{
"name": "Casper",
"properties": {
"age": 3,
"interests": [
"Other dogs"
]
}
},
{
"name": "Indy",
"properties": {
"age": 2,
"interests": [
"Butter"
]
}
},
{
"name": "Kira",
"properties": {
"age": 8,
"interests": [
"Rubs"
]
}
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry').properties))]"
}
}
}
前面的示例基于数组来生成对象。
名称 | 类型 | Value |
---|---|---|
dogsObject | Object | {"Evie":{"age":5,"interests":["Ball","Frisbee"]},"Casper":{"age":3,"interests":["Other dogs"]},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age":8,"interests":["Rubs"]}} |
后续步骤
- 有关其他与数组相关的模板函数,请参阅模板函数 - 数组。