toggle

Aprende a usar la expresión Lambda en Blogger

min rel

La expresión lambda nos permite comprobar si alguno, todos o ninguno de los elementos de un conjunto de datos cumple con una condición. En algunos casos puede comprobar los datos sin necesidad de incluir un ciclo b:loop. Su sintaxis es la siguiente:


[conjunto de datos] [operador lambda] ([variable] => [expresión])

Que dependiendo del operador lambda, puede formar parte de una condición o de un ciclo:


<b:[tag] cond='[conjunto de datos] [operador] ([variable] => [expresión])'/>
<b:loop values='[conjunto de datos] [operador] ([variable] => [expresión])' var='[variable]'/>

En cuanto a los operadores disponibles, tenemos any, all, none, count, filter, map y first.


Ejemplos de uso

En este ejemplo vamos a verificar si entre todas las entradas del blog, existe alguna creada por el autor "Demo-chan".


<b:if cond='data:posts any (p => p.author == "Demo-chan")'>
   <!-- Si entre las entradas, alguna fue publicada por "Demo-chan" [true] -->
</b:if>

No es necesario que la expresión se encuentre dentro de un bucle, debido a que el conjunto de datos de las entradas puede ser manejado por la expresión lambda.


Ahora vamos a comprobar si una etiqueta se encuentre o no dentro de un conjunto de datos. Esta vez se utiliza un ciclo b:loop debido a que los datos de las etiquetas requieren del ciclo de entradas.


<b:loop values='data:posts' var='post'>
   <b:if cond='data:post.labels none (l => l.name == "CSS")'>
      <!-- Si entre las etiquetas existe una llamada "CSS" [true] -->
   </b:if>
</b:loop>

En el ejemplo anterior, comprobamos que ninguna lleve de nombre "CSS", si no existe ninguna la condición devuelve verdadero. Ahora vamos a repasar cada operador y su función dentro de la expresión lambda.


Operador ANY

Sirve para comprobar si un determinado valor forma parte de un conjunto de datos. En este ejemplo comprobamos si entre todas las entradas, alguna lleva un título en específico:


<b:if cond='data:posts any (p => p.title == "Entrada para Demo-chan")'>
   <!-- Si entre las entradas, alguna lleva de título "Entrada para Demo-chan" [true] -->
</b:if>

En este otro ejemplo, comprobamos si entre todas las etiquetas, una de ellas lleva de nombre "demo".


<b:if cond='data:post.labels any (l => l.name == "demo")'>
    <!-- Si entre las etiquetas existe una llamada "demo" [true] -->
</b:if>

Operador ALL

Sirve para comprobar todos los valores de un conjunto de datos. Por ejemplo:


<b:if cond='data:post.labels all (l => l.name in ["blogger","google","demo"])'>
    <!-- Si todas las etiquetas son "blogger, google y demo" [true] -->
</b:if>

Para que el código anterior sea verdadero, la entrada debe tener únicamente las etiquetas blogger, google y demo. Si existiera una etiqueta extra o faltara alguna entonces la condición devolvería falso.


Operador NONE

Este operador comprueba que uno o varios valores no se encuentren dentro de un conjunto de datos. Por ejemplo:


<b:if cond='data:posts none (p => p.author == "Demo-chan")'>
   <!-- Si entre las entradas, ninguna fue publicada por "Demo-chan" [true] -->
</b:if>

La condición anterior devuelve verdadero, si entre todas las entradas, ninguna fue publicado por Demo-chan.


Operador COUNT

Cuenta los valores que devuelven verdadero dentro de la expresión. Por ejemplo:


<b:if cond='data:post.labels count (l => l.name in {"blogger","google"}) >= 1'>
   <!-- Si la cantidad de valores que devuelven verdadero es mayor o igual a 1 [true] -->
</b:if>

Para que la condición anterior se cumpla, la entrada deberá tener las etiquetas blogger y google, o al menos una de las dos. En caso de que no cuente con ninguna devolverá falso.


Operador FILTER

Filtra los datos seleccionados dentro de un conjunto de datos, solo se puede utilizar en los bucles o ciclos b:loop. Por ejemplo:


<b:loop values='data:post.labels filter (l => l.name != "blogger")' var='label'>
   <!-- Se retira la etiqueta "blogger" dentro del bucle de etiquetas -->
</b:loop>

En el ejemplo anterior, se compara el nombre de las etiquetas, para que no sea "blogger", provocando que en el ciclo ésta última no aparezca.


Operador MAP

Devuelve un conjunto de datos que contiene los resultados de la expresión lambda, pero requiere bucles o ciclos b:loop. Por ejemplo:


<b:loop values='data:post.labels map (l => "#" + l.name)' var='label'>
   <span><data:label/></span>
</b:loop>

El código anterior creará un grupo de etiquetas que corresponden a la entrada, pero cada una tendrá una almohadilla al inicio del nombre. El valor resultante será mostrado dentro de la variable del bucle <data:label/>, por lo tanto no se pueden usar las etiquetas data que normalmente corresponden al ciclo, en este caso serían <data:label.name/> y <data:label.url/>.


Operador FIRST

Filtra los valores dentro de un conjunto de datos, pero solo muestra el primer valor que devuelve verdadero. Por ejemplo:


<b:loop values='data:post.labels first (l => l.name != "asus")' var='label'>
   <!-- Devuelve verdadero si una de las etiquetas no es "asus", pero solo 
   muestra la primera etiqueta que cumpla la condición -->
</b:loop>

Para entender el código anterior, supongamos que tenemos una entrada con las etiquetas asus, blogger y google. La primera etiqueta no cumple la función, entonces pasa a la siguiente y esta si devuelve verdadero, como es la primera que cumple la condición solo se mostrará "blogger".


La expresión Lambda nos agrega mayor flexibilidad para la creación de plantillas personalizadas, si tienes alguna duda no dudes en comentar.