Partager via


Fonctions Lambda pour les modèles ARM

Cet article décrit les fonctions lambda à utiliser dans les modèles ARM. Les fonctions lambda sont essentiellement des blocs de code qui peuvent être passés en tant qu’argument. Elles peuvent prendre plusieurs paramètres, mais sont limitées à une seule ligne de code. Dans Bicep, une expression lambda est au format suivant :

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

Conseil

Nous recommandons Bicep, parce qu’il offre les mêmes fonctionnalités que les modèles ARM et que la syntaxe est plus facile d’utilisation. Pour plus d’informations, reportez-vous aux fonctions de déploiement.

Limites

La fonction lambda de modèle ARM présente les limitations suivantes :

  • L’expression lambda ne peut être spécifiée que directement en tant qu’arguments de fonction dans ces fonctions : filter(), , groupBy(), map(), mapValues(), reduce(), sort()et toObject().
  • L’utilisation de variables lambda (variables temporaires utilisées dans les fonctions lambda) à l’intérieur de l’accès au tableau de ressources ou de modules n’est pas prise en charge pour le moment.
  • L’utilisation de variables lambda à l’intérieur de la fonction listKeys n’est pas prise en charge.
  • L’utilisation de variables lambda à l’intérieur de la fonction reference n’est pas prise en charge.

filter

filter(inputArray, lambda function)

Filtre un tableau avec une fonction de filtrage personnalisée.

Dans Bicep, utilisez la fonction filter.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Tableau à filtrer.
fonction lambda Oui expression Fonction lambda appliquée à chaque élément d’un tableau d’entrée. Si la valeur est fausse, l’élément sera exclu du tableau de sortie.

Valeur retournée

Tableau.

Exemples

Les exemples suivants montrent comment utiliser la fonction 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'))))]"
    }
  }
}

Sorties de l’exemple précédent :

Nom Type Valeur
oldDogs Array [{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}]
dogNameIndex Tableau [{"name » :"Casper »,"age » :3,"interests » :["Autres chiens"]}]

oldDogs répertorie les chiens qui sont cinq ou plus âgés ; dogNameIndex identifie les chiens dont le numéro d’index est inférieur à deux et dont le nom commence par la lettre « 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))))]"
    }
  }
}

La sortie de l’exemple précédent :

Nom Type Valeur
filteredLoop Array [6, 7, 8, 9]
isEven Array [0, 2, 4, 6, 8]

filterdLoop affiche les nombres d’un tableau qui sont supérieurs à 5, et isEven affiche les nombres pairs du tableau.

groupBy

groupBy(inputArray, lambda expression)

Crée un objet avec des valeurs de tableau à partir d’un tableau, à l’aide d’une condition de regroupement.

Dans Bicep, utilisez la fonction groupBy.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Le tableau pour le regroupement.
expression lambda Oui expression L’expression lambda est appliquée à chaque élément de tableau d’entrée et regroupe les éléments à l’aide de la condition de regroupement.

Valeur retournée

Objet .

Exemples

L’exemple suivant explique comment utiliser la fonction 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)))]"
    }
  }
}

La sortie de l’exemple précédent montre les chiens qui ont cinq ans ou plus :

Nom Type Value
outObject Object {"f":["foo"],"b":["bar","baz"]}

outObject affiche un objet qui regroupe les éléments de tableau par leurs premières lettres.

map

map(inputArray, lambda function)

Applique une fonction de mappage personnalisée à chaque élément d’un tableau.

Dans Bicep, utilisez la fonction map.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Tableau à mapper.
fonction lambda Oui expression Fonction lambda appliquée à chaque élément d’un tableau d’entrée afin de générer le tableau de sortie.

Valeur retournée

Tableau.

Exemple

L’exemple suivant explique comment utiliser la fonction 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)))]"
    }
  }
}

La sortie de l’exemple précédent est :

Nom Type Valeur
dogNames Array ["Evie","Casper","Indy","Kira"]
sayHi Array ["Hello Evie!","Hello Casper!","Hello Indy!","Hello Kira!"]
mapArray Array [{"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 Tableau [{"index » :0,"val » :"Evie"},{"index » :1,"val » :"Casper"},{"index » :2,"val » :"Indy"},{"index » :3,"val » :"Kira"}]

dogNames affiche les noms des chiens à partir du tableau d’objets ; sayHi concatène « Hello » et chacun des noms de chiens ; mapArray et mapArrayIndex créent deux autres tableaux d’objets.

mapValues

mapValues(inputObject, lambda expression)

Crée un objet à partir d’un objet d’entrée à l’aide d’une expression lambda pour mapper des valeurs.

Dans Bicep, utilisez la fonction mapValues.

Paramètres

Paramètre Obligatoire Type Description
inputObject Oui object Objet à mapper.
expression lambda Oui expression Expression lambda utilisée pour mapper les valeurs.

Valeur retournée

Objet.

Exemple

L’exemple suivant explique comment utiliser la fonction 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'))))]"
    }
  }
}

La sortie de l’exemple précédent est :

Nom Type Value
mapObject Object {foo : « FOO », bar : « BAR »}

mapObject crée un autre objet avec les valeurs en majuscules.

reduce

reduce(inputArray, initialValue, lambda function)

Réduit un tableau à l’aide d’une fonction de réduction personnalisée.

Dans Bicep, utilisez la fonction reduce.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Tableau à réduire.
initialValue Oui n'importe laquelle Valeur initiale.
fonction lambda Oui expression Fonction lambda utilisée pour agréger la valeur actuelle et la valeur suivante.

Valeur retournée

Tout.

Exemple

Les exemples suivants montrent comment utiliser la fonction 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'))))]"
    }
  }
}

La sortie de l’exemple précédent est :

Nom Type Valeur
totalAge int 18
totalAgeAdd1 int 19
oddAge int 7

totalAge additionne l’âge des chiens. totalAgeAdd1 a une valeur initiale de 1, et ajoute tous les âges des chiens aux valeurs initiales. oddAge additionne les âges des chiens situés à des indices pairs, en particulier 5 (Evie) et 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'))))]"
    }
  }
}

La sortie de l’exemple précédent est :

Nom Type Valeur
reduceObjectUnion object {"foo":123,"bar":456,"baz":789}

La fonction union retourne un objet unique avec tous les éléments à partir des paramètres. L’appel de fonction associe les paires clé-valeur des objets dans un nouvel objet.

sort

sort(inputArray, lambda function)

Trie un tableau avec une fonction de tri personnalisée.

Dans Bicep, utilisez la fonction sort.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Tableau à trier.
fonction lambda Oui expression Fonction lambda utilisée pour comparer deux éléments de tableau à des fins de classement. Si la valeur est true, le deuxième élément sera placé après le premier dans le tableau de sortie.

Valeur retournée

Tableau.

Exemple

L’exemple suivant explique comment utiliser la fonction 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)))]"
    }
  }
}

La sortie de l’exemple précédent trie les objets chiens du plus jeune au plus âgé :

Nom Type Valeur
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])

Convertit un tableau en objet avec une fonction de clé personnalisée et une fonction de valeur personnalisée facultative. Consultez les éléments relatifs à la conversion d’un objet en tableau.

Dans Bicep, utilisez la fonction toObject.

Paramètres

Paramètre Obligatoire Type Description
inputArray Oui tableau Tableau utilisé pour créer un objet.
fonction lambda Oui expression Fonction lambda utilisée pour fournir le prédicat de clé.
fonction lambda Non expression Fonction lambda utilisée pour fournir le prédicat de valeur.

Valeur retournée

Objet.

Exemple

L’exemple suivant montre comment utiliser la fonction toObject avec les deux paramètres requis :

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

L’exemple précédent génère un objet basé sur un tableau.

Nom Type Valeur
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"]}}

La fonction toObject suivante, avec le troisième paramètre, fournit le même résultat.

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

L’exemple suivant montre comment utiliser la fonction toObject avec trois paramètres.

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

L’exemple précédent génère un objet basé sur un tableau.

Nom Type Valeur
dogsObject Object {"Evie":{"age":5,"interests":["Ball","Frisbee"]},"Casper" :{"age":3,"interests":["Other dogs"]},"Indy" :{"age":2,"interests":["Butter"]},"Kira" :{"age":8,"interests" :["Rubs"]}}

Étapes suivantes