Populaire cette année

Les opérateurs Lambdas / Lambda operators : any, all, none, count, map, where, first

Blogger - Opérateurs Lambdas / Lambda operators

Les opérateurs Lambdas sont des expressions spécifiques au langage Blogger, qui permettent de traiter des tableaux en fonction de critères contenus dans ce tableau.



Prérequis !

La mise en œuvre des opérateurs Lambdas requiert une maitrise des autres opérateurs et une connaissance approfondie des types de données !

Syntaxe de base d'une expression lambda

Un Lambda a la particularité de piocher les items contenus dans un tableau sans avoir à recourir à l'usage d'une boucle avec la balise <b:loop>.

Syntaxe

array operator var => expression
  • La première opérande est un tableau.

  • Entre les opérandes, vous mentionnez un opérateur. Au total, il y en a 7. Chacun renvoie un résultat spécifique. (Voir plus bas le chapitre Les syntaxes opérateurs).

  • La seconde opérande est le lambda var => .... C'est dans cette opérande que les noms des données issues du tableau de la 1ère opérande doivent être intégrés. Souvent, cette opérande est encadrée de parenthèses pour une raison purement "esthétique". Dans sa syntaxe simplifiée, elles sont facultatives mais peuvent devenir obligatoires lorsque lorsqu'il faut définir des priorités.

  • var est un quelconque nom de variable. Il sera utilisé pour recomposer les données du tableau. Par exemple : var.item.

En résumé, le lambda est une opération imbriquée qui permet d'inclure des éléments d'un tableau.

Exemple

data:posts map p => p.title
  • data:posts est un tableau d'objets.

  • map est l'opérateur qui a pour fonction de recréer un tableau en fonction des critères injectés dans le lambda.

  • p est un quelconque nom de variable.

  • title est un item de type string contenu dans le tableau data:posts.

Dans cet exemple, le résultat de l'opération sera un nouveau tableau de type array[string] ne contenant que l'item data:posts[p].title.

Exemple de résultat
["title1","title2","title3"]


Les syntaxes des opérateurs lambdas

Noms Opérateurs Syntaxes Opérandes Résultat

Au moins 1

any

Syntaxe par défaut

array any var => boolean
Nombre d'opérandes : 2 Résultat : boolean

Tout

all

Syntaxe par défaut

array all var => boolean
Nombre d'opérandes : 2 Résultat : boolean

Aucun

none

Syntaxe par défaut

array none var => boolean
Nombre d'opérandes : 2 Résultat : boolean

Compteur

count

Syntaxe par défaut

array count var => boolean
Nombre d'opérandes : 2 Résultat : number

Mappage

map ou select

Syntaxes par défaut

array map var => criterion
array select var => criterion
Nombre d'opérandes : 2 Résultat : array[criterion]

Filtre

filter ou where

Syntaxes par défaut

array filter var => boolean
array where var => boolean
Nombre d'opérandes : 2 Résultat : array

Premier

first

Syntaxe par défaut

array first var => boolean
Nombre d'opérandes : 2 Résultat : Type enfant du tableau


Les lambdas conditionnels : Any, all et any

Les opérateurs any, all et none renvoient toujours une valeur boolean.

Le résultat de l'expression imbriquée dans le Lambda doit toujours être une valeur booléenne.

  • any : Au moins un des sets du tableau correspond au critère.

  • all : Tous les sets du tableau correspondent au critère.

  • none : Inverse de all.

any - Au moins 1

<b:if cond='data:posts any (p => p.numComments gt 5)'>

</b:if>

Le résultat de l'opération sera : true si au moins l'un des posts du tableau contient plus de 5 commentaires.

all - Tous

<b:if cond='data:posts all (p => p.numComments gt 5)'>

</b:if>

Le résultat de l'opération sera : true si tous les posts du tableau contiennent plus de 5 commentaires.

none - Aucun

<b:if cond='data:posts none (p => p.numComments gt 5)'>

</b:if>

Le résultat de l'opération sera : true si aucun post du tableau ne contient plus de 5 commentaires.



Le compteur lambda : count

L'opérateur count renvoie une valeur de type number.

Le résultat de l'expression imbriquée dans le Lambda doit toujours être boolean.

Le compteur renvoie le nombre de sets du tableau correspondant au critère.

count

<b:eval expr='data:posts count (p => p.numComments gt 5)'/>

Le résultat de l'opération sera le nombre de posts du tableau contenant plus de 5 commentaires.



Le lambda de mappage (ou de sélection) : map et select

L'opérateur map (ou select) crée un nouvel array à partir d'un item contenu dans ce tableau ou à partir du résultat de l'expression imbriquée.

Le nouveau tableau sera du même type que le résultat de l'expression imbriquée :

  • object devient array[object]
  • string devient array[string]
  • number devient array[number]
  • boolean devient array[boolean]
  • etc...

A partir d'une donnée

<b:loop values='data:posts map (p => p.numComments)' var='newArray'>

  <data:newArray/>

</b:loop>

Le résultat de l'opération sera un tableau de type array[number], puisque le critère est une donnée de type number.

Le nouveau tableau contiendra un set de nombres. Dans ce cas-ci, les nombres de commentaires des posts.

A partir du résultat d'une expression

<b:loop values='data:posts map (p => p.numComments gt 5)' var='newArray'>

  <data:newArray/>

</b:loop>

Le résultat de l'opération sera un tableau de type array[boolean], puisque le critère est une expression dont le résultat est boolean.

Le nouveau tableau contiendra un set de booléens. Dans ce cas-ci, une série de valeurs true ou false en fonction des posts contenant plus de 5 commentaires.



Les lambdas filtreurs : filter, where et first

Les opérateurs filter (ou where) et first renvoient un nouvel array ne contenant les sets correspondants au critère.

  • where ou filter : Sélectionne tous les sets du tableau correspondants au critère.

  • first : Sélectionne uniquement le premier set du tableau correspondant au critère. Le type de résultat sera le type enfant du tableau.

where

<b:loop values='data:posts where (p => p.numComments gt 5)' var='post'>

</b:loop>

Le tableau data:posts ne contient que les posts ayant plus de 5 commentaires.

first

<b:with value='data:posts first (p => p.numComments gt 5)' var='post'>

</b:with>

Le tableau data:posts ne contient que le premier post ayant plus de 5 commentaires. Comme il ne contient qu'un seul set, la création d'une boucle n'est pas nécessaire.



Les tableaux imbriqués

Dans la bibliothèque des données Blogger, vous trouverez quelques tableaux imbriqués, comme par exemple, la liste hiérarchique dans le gadget Archive, ou encore les commentaires, les libellés, les pièces jointes des articles dans le gadget Blog, etc...

Dans ces cas, vous pouvez imbriquer un lambda dans un lambda.

Par exemple, les articles ayant ce libellé.

Le premier lambda peut contenir un opérateur quelconque (any, all, none, count, map, where ou first), tandis que le second lambda doit impérativement contenir un opérateur conditionnel (any, all ou none).

Condition - any - Au moins 1

<b:if cond='data:posts any (p => p.labels any (l => l.name == "My photos"))'>

</b:if>

Le résultat de l'opération sera : true si au moins l'un des posts du tableau contient le libellé « My photos ».

Condition - all - Tous

<b:if cond='data:posts all (p => p.labels any (l => l.name == "My photos"))'>

</b:if>

Le résultat de l'opération sera : true si tous les posts du tableau contiennent le libellé « My photos ».

Condition - none - Aucun

<b:if cond='data:posts none (p => p.labels any (l => l.name == "My photos"))'>

</b:if>

Le résultat de l'opération sera : true si aucun post du tableau ne contient pas le libellé « My photos ».

Compteur - count

<b:eval expr='data:posts count (p => p.labels any (l => l.name == "My photos"))'/>

Le résultat de l'opération sera le nombre de posts du tableau contenant le libellé « My photos ».

Mappage - map

<b:loop values='data:posts map (p => p.labels any (l => l.name == "My photos"))' var='newArray'>

  <data:newArray/>

</b:loop>

Le résultat de l'opération sera un tableau de type array[boolean], puisque le critère est la seconde opération lambda dont la valeur du résultat est de type boolean.

Le nouveau tableau contiendra un set de valeurs booléennes [true,false,true,false].

Filtre - where

<b:loop values='data:posts where (p => p.labels any (l => l.name == "My photos"))' var='post'>

</b:loop>

Le tableau data:posts ne contient que les posts ayant le libellé « My photos ».

Filtre - first

<b:with value='data:posts first (p => p.labels any (l => l.name == "My photos"))' var='post'>

</b:with>

Le tableau data:posts ne contient que le premier post ayant le libellé « My photos ».


Et si vous voulez afficher les libellés de ce post en économisant une boucle, vous pouvez écrire :

L'Astuce du boss

<b:loop values='(data:posts first (p => p.labels any (l => l.name == "My photos"))).labels' var='label'>
  <data:label.name/>
</b:loop>


Exercices

Afin de vous familiariser avec les opérateurs Lambdas, nous avons créé un petit gadget contenant un tableau avec les Présidents Américains des années 70's à nos jours.

Schéma du tableau


  presidents: 
    name: string,
    startTerm: number,
    endTerm: number,
    party: string
  

Ajoutez le gadget sur votre blog expérimental et exercez-vous à créer des opérations ou à modifier les exemples.



Spotlight

Populaires cette semaine