Funkcje lambda dla szablonów usługi ARM

W tym artykule opisano funkcje lambda do użycia w szablonach usługi ARM. Funkcje lambda to zasadniczo bloki kodu, które można przekazać jako argument. Mogą przyjmować wiele parametrów, ale są ograniczone do jednego wiersza kodu. W wyrażeniu lambda w języku Bicep ma następujący format:

lambda(<lambda variable>, [<lambda variable>, ...], <expression>)

Napiwek

Zalecamy Bicep , ponieważ oferuje te same możliwości co szablony usługi ARM, a składnia jest łatwiejsza w użyciu. Aby dowiedzieć się więcej, zobacz funkcje wdrażania .

Ograniczenia

Funkcja lambda szablonu usługi ARM ma następujące ograniczenia:

  • Funkcję lambda można określić tylko bezpośrednio jako argumenty funkcji w tych funkcjach: filter(), , reduce()map(), sort()i toObject().
  • Używanie zmiennych lambda (zmiennych tymczasowych używanych w funkcjach lambda) w dostępie do zasobów lub tablicy modułów nie jest obecnie obsługiwane.
  • Używanie zmiennych lambda wewnątrz listKeys funkcji nie jest obecnie obsługiwane.
  • Używanie zmiennych lambda wewnątrz funkcji referencyjnej nie jest obecnie obsługiwane.

filtr

filter(inputArray, lambda function)

Filtruje tablicę za pomocą niestandardowej funkcji filtrowania.

W Bicep użyj funkcji filter .

Parametry

Parametr Wymagania Type Opis
inputArray Tak tablica Tablica do filtrowania.
lambda, funkcja Tak wyrażenie Funkcja lambda zastosowana do każdego elementu tablicy wejściowej. Jeśli wartość false, element jest filtrowany z tablicy wyjściowej.

Wartość zwracana

Tablicy.

Przykłady

W poniższych przykładach pokazano, jak używać filter funkcji.

{
  "$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)))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu pokazują psy, które są pięć lub starsze:

Nazwisko Typ Wartość
oldDogs Tablica [{"name":"Evie","age":5,"interests"::"Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}]
{
  "$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))))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu:

Nazwisko Typ Wartość
filteredLoop Tablica [6, 7, 8, 9]
Iseven Tablica [0, 2, 4, 6, 8]

filterdLoop pokazuje liczby w tablicy, które są większe niż 5; i isEven pokazuje liczby parzystych w tablicy.

map

map(inputArray, lambda function)

Stosuje funkcję mapowania niestandardowego do każdego elementu tablicy.

W Bicep użyj funkcji mapowania.

Parametry

Parametr Wymagania Type Opis
inputArray Tak tablica Tablica do mapowania.
lambda, funkcja Tak wyrażenie Funkcja lambda zastosowana do każdego elementu tablicy wejściowej w celu wygenerowania tablicy wyjściowej.

Wartość zwracana

Tablicy.

Przykład

W poniższym przykładzie pokazano, jak używać map funkcji.

{
  "$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)))]"
    },
    "mapObject": {
      "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))))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
dogNames Tablica ["Evie","Casper","Indy","Kira"]
sayHi Tablica ["Hello Evie!","Hello Casper!","Hello Indy!","Hello Kira!"]
mapObject Tablica [{"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!"}]

dogNames pokazuje nazwy psów z tablicy obiektów; sayHi łączy "Hello" i każdy z nazw psów; a mapObject tworzy kolejną tablicę obiektów.

Zmniejszyć

reduce(inputArray, initialValue, lambda function)

Zmniejsza tablicę za pomocą niestandardowej funkcji redukcji.

W Bicep użyj funkcji redukcji.

Parametry

Parametr Wymagania Type Opis
inputArray Tak tablica Tablica do zmniejszenia.
initialValue Tak dowolny Wartość początkowa.
lambda, funkcja Tak wyrażenie Funkcja lambda używana do agregowania bieżącej wartości i następnej wartości.

Wartość zwracana

Wszelki.

Przykład

W poniższych przykładach pokazano, jak używać reduce funkcji.

{
  "$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'))))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
totalAge int 18
totalAgeAdd1 int 19

totalAge sumuje wiek psów; totalAgeAdd1 ma początkową wartość 1 i dodaje wszystkie grupy wiekowe psów do początkowych wartości.

{
  "$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'))))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
reduceObjectUnion obiekt {"foo":123,"bar":456,"baz":789}

Funkcja union zwraca pojedynczy obiekt ze wszystkimi elementami z parametrów. Wywołanie funkcji łączy pary wartości klucza obiektów w nowy obiekt.

sort

sort(inputArray, lambda function)

Sortuje tablicę za pomocą niestandardowej funkcji sortowania.

W Bicep użyj funkcji sortowania.

Parametry

Parametr Wymagania Type Opis
inputArray Tak tablica Tablica do sortowania.
lambda, funkcja Tak wyrażenie Funkcja lambda używana do porównywania dwóch elementów tablicy do porządkowania. Jeśli wartość true, drugi element zostanie uporządkowany po pierwszym w tablicy wyjściowej.

Wartość zwracana

Tablicy.

Przykład

W poniższym przykładzie pokazano, jak używać sort funkcji.

{
  "$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)))]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu sortuje obiekty psów od najmłodszych do najstarszych:

Nazwisko Typ Wartość
dogsByAge Tablica [{"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])

Konwertuje tablicę na obiekt z funkcją klucza niestandardowego i opcjonalną funkcją wartości niestandardowej. Zobacz elementy dotyczące konwertowania obiektu na tablicę.

W Bicep użyj funkcji toObject .

Parametry

Parametr Wymagania Type Opis
inputArray Tak tablica Tablica używana do tworzenia obiektu.
lambda, funkcja Tak wyrażenie Funkcja lambda używana do zapewnienia predykatu klucza.
lambda, funkcja Nie. wyrażenie Funkcja lambda używana do podawania predykatu wartości.

Wartość zwracana

Obiekt .

Przykład

W poniższym przykładzie pokazano, jak używać toObject funkcji z dwoma wymaganymi parametrami:

{
  "$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))]"
    }
  }
}

Powyższy przykład generuje obiekt na podstawie tablicy.

Nazwisko Typ Wartość
dogsObject Objekt {"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"]}}

Poniższa toObject funkcja z trzecim parametrem udostępnia te same dane wyjściowe.

"outputs": {
  "dogsObject": {
    "type": "object",
    "value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry')))]"
  }
}

W poniższym przykładzie pokazano, jak używać toObject funkcji z trzema parametrami.

{
  "$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))]"
    }
  }
}

Powyższy przykład generuje obiekt na podstawie tablicy.

Nazwisko Typ Wartość
dogsObject Objekt {"Evie":{"age"::5,"interests":["Ball","Frisbee"]},"Casper":{"age":3,"interests":["Other dogs"]},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age":8,"interests":["Rubs"]}}

Następne kroki