Bicep 的 lambda 函数

本文介绍要在 Bicep 中使用的 lambda 函数。 Lambda 表达式(或 lambda 函数)本质上可以作为参数传递的代码块。 它们可以采用多个参数,但限制为单个代码行。 在 Bicep 中,Lambda 表达式采用以下格式:

<lambda variable> => <expression>

注意

lambda 函数仅在 Bicep CLI version 0.10.X 或更高版本中受支持。

限制

Bicep lambda 函数具有以下限制:

  • Lambda 表达式只能在以下函数中直接指定为函数参数:filter()groupBy()map()mapValues()reduce()sort()toObject()
  • 目前不支持在资源或模块数组访问中使用 lambda 变量(Lambda 表达式中使用的临时变量)。
  • 目前不支持在 listKeys 函数中使用 lambda 变量。
  • 目前不支持在 reference 函数中使用 lambda 变量。

filter

filter(inputArray, lambda expression)

借助自定义筛选函数来筛选数组。

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 要筛选的数组。
lambda 表达式 表达式 lambda 表达式将应用于每个输入数组元素。 如果结果为 true,则该项会包含在输出数组中,否则会放弃该项。

返回值

一个数组。

示例

下面的示例展示了如何使用 filter 函数。

var dogs = [
  {
    name: 'Evie'
    age: 5
    interests: ['Ball', 'Frisbee']
  }
  {
    name: 'Casper'
    age: 3
    interests: ['Other dogs']
  }
  {
    name: 'Indy'
    age: 2
    interests: ['Butter']
  }
  {
    name: 'Cira'
    age: 8
    interests: ['Rubs']
  }
]

output oldDogs array = filter(dogs, dog => dog.age >=5)
output dogNameIndex array = filter(dogs, (val, i) => i < 2 && substring(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”开头的犬

var itemForLoop = [for item in range(0, 10): item]

output filteredLoop array = filter(itemForLoop, i => i > 5)
output isEven array = filter(range(0, 10), i => 0 == i % 2)

上述示例的输出:

名称 类型
filteredLoop Array [6, 7, 8, 9]
isEven Array [0, 2, 4, 6, 8]

filterdLoop 显示数组中大于 5 的数字;isEven 显示数组中的偶数。

groupBy

groupBy(inputArray, lambda expression)

根据分组条件,使用数组中的数组值创建一个对象。

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 用于分组的数组。
lambda 表达式 表达式 Lambda 表达式应用于每个输入数组元素,并根据分组条件对元素进行分组。

返回值

一个 对象。

示例

以下示例演示如何使用 groupBy 函数。

var inputArray = ['foo', 'bar', 'baz']

output outObject object = groupBy(inputArray, x => substring(x, 0, 1)) 

上一示例的输出:

名称 类型
outObject Object {"f":["foo"],"b":["bar","baz"]}

outObject 显示一个按数组元素的第一个字母对数组元素进行分组的对象。

map

map(inputArray, lambda expression)

将自定义映射函数应用于数组的每个元素。

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 要映射的数组。
lambda 表达式 表达式 将 Lambda 表达式应用于每个输入数组元素,以便生成输出数组。

返回值

一个数组。

示例

以下示例演示如何使用 map 函数。

var 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']
  }
]

output dogNames array = map(dogs, dog => dog.name)
output sayHi array = map(dogs, dog => 'Hello ${dog.name}!')
output mapArray array = map(range(0, length(dogs)), i => {
  i: i
  dog: dogs[i].name
  greeting: 'Ahoy, ${dogs[i].name}!'
})
output mapArrayIndex array = map(dogs, (x, i) => { index: i, val: 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 表达式来映射值。

命名空间:sys

参数

参数 必选 类型​​ 描述
inputObject 对象 (object) 要映射的对象。
lambda 表达式 表达式 用于映射值的 Lambda 表达式。

返回值

一个对象。

示例

以下示例演示如何使用 mapValues 函数。

var inputObject = { foo: 'foo', bar: 'bar' }

output mapObject object = mapValues(inputObject, val => toUpper(val)) 

前述示例的输出为:

名称 类型
mapObject Object {foo: 'FOO', bar: 'BAR'}

mapObject 创建另一个具有大写值的对象。

reduce

reduce(inputArray, initialValue, lambda expression)

借助自定义 reduce 函数减少数组。

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 要减少的数组。
initialValue any 初始值。
lambda 表达式 表达式 用于聚合当前值和下一个值的 Lambda 表达式。

返回值

任何。

示例

下面的示例展示了如何使用 reduce 函数。

var 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']
  }
]
var ages = map(dogs, dog => dog.age)
output totalAge int = reduce(ages, 0, (cur, next) => cur + next)
output totalAgeAdd1 int = reduce(ages, 1, (cur, next) => cur + next)
output oddAge int = reduce(ages, 0, (cur, next, i) => (i % 2 == 0) ? cur + next : cur)

上述示例的输出如下:

名称 类型
totalAge int 18
totalAgeAdd1 int 19
oddAge int 7

totalAge 对狗的年龄进行求和;totalAgeAdd1 的初始值为 1,并将所有狗的年龄添加到初始值。 oddAge 对偶数索引处犬的犬龄(具体为 5 (Evie) 和 2 (Indy))求和

output reduceObjectUnion object = reduce([
  { foo: 123 }
  { bar: 456 }
  { baz: 789 }
], {}, (cur, next) => union(cur, next))

前述示例的输出为:

名称 类型
reduceObjectUnion object {"foo":123,"bar":456,"baz":789}

union 函数返回包含参数中所有元素的单个对象。 函数调用将对象的键值对联合为一个新对象。

sort

sort(inputArray, lambda expression)

借助自定义 sort 函数对数组进行排序。

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 要排序的数组。
lambda 表达式 表达式 用于比较两个数组元素以进行排序的 Lambda 表达式。 如果为 true,第二个元素将排在输出数组的第一个元素之后。

返回值

一个数组。

示例

以下示例演示如何使用 sort 函数。

var 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']
  }
]

output dogsByAge array = sort(dogs, (a, b) => a.age < 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 expression, [lambda expression])

通过一个自定义键函数和可选的自定义值函数将数组转换为对象。 请参阅有关将对象转换为数组的

命名空间:sys

参数

参数 必选 类型​​ 说明
inputArray array 用于创建对象的数组。
lambda 表达式 表达式 用于提供键谓词的 lambda 表达式。
lambda 表达式 表达式 用于提供值谓词的 lambda 表达式。

返回值

一个对象。

示例

以下示例展示了如何将 toObject 函数与两个必需参数一起使用:

var 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' ]
  }
]

output dogsObject object = toObject(dogs, entry => 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 函数提供相同的输出。

output dogsObject object = toObject(dogs, entry => entry.name, entry => entry)

以下示例展示了如何将 toObject 函数与三个参数一起使用。

var 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' ]
    }
  }
]
output dogsObject object = toObject(dogs, entry => entry.name, entry => 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"]}}

后续步骤