Fonctions sans nom
Il suffit de mettre, une lambda est une fonction sans nom, ou une fonction anonyme. Un petit morceau de code exécutable, qui peuvent être passés comme si c'était une variable. En JavaScript:
function () {}; // very simple
Nous allons voir maintenant quelques utilisations de ces lambdas.
L'abstraction de code réutilisable
Les Lambdas peuvent être utilisés de faire abstraction de code réutilisable. Par exemple des boucles. Nous avons l'habitude d'écrire for
et while
boucles tout au long de la journée. Mais c'est le code qui n'est pas écrit. Nous avons pu extraire le code à l'intérieur de la boucle, la partie la plus importante de la boucle, et abstraction du reste:
for (var i=0; i<array.length; i++) {
// do what something useful with array[i]
}
en utilisant l' forEach
de tableau d'objets, devient:
array.forEach(function (element, index) {
// do something useful with element
// element is the equivalent of array[i] from above
});
La au-dessus de l'abstraction peut ne pas être utile, mais il y a d'autres des fonctions d'ordre supérieur, comme forEach
, qui effectuent beaucoup plus de tâches utiles. Par exemple filter
:
var numbers = [1, 2, 3, 4];
var even = [];
// keep all even numbers from above array
for (var i=0; i<numbers.length; i++) {
if (numbers[i] % 2 === 0) {
even.push(numbers[i]);
}
}
alert(even);
// Using the filter method
even = [1, 2, 3, 4].filter(function (number) {
return number % 2 === 0;
});
alert(even);
Code délai d'exécution
Dans certains environnements, dans lesquels le concept de l'événement est disponible, on peut utiliser des lambdas pour répondre à des événements qui peuvent se produire à un certain point dans le temps.
window.onload = function () {
alert("Loaded");
};
window.setTimeout(function () {
alert("Code executed after 2 seconds.");
}, 2000);
Cela aurait pu être fait dans d'autres façons, mais ceux-ci sont assez bavard. Par exemple, en Java il y a l' Runnable
interface.
Les usines de fonctions
Jusqu'à ce point, nous n'avons utilisé que les lambdas pour son sucre syntaxique des capacités pour la plupart. Mais il existe des situations où elles peuvent être beaucoup plus utile. Pour exemple, on peut avoir les fonctions qui retournent des lambdas. Disons que nous avons une fonction que nous voulons que les valeurs de retour d'être mis en cache.
var users = [];
var getUser = function (name) {
if (! users[name]) {
// expensive operations to get a user. Ajax for example
users[name] = user_from_ajax;
}
return users[name];
};
Plus tard, nous pouvons remarquer que nous avons une fonction similaire:
var photos = [];
var getPhoto = function (name) {
if (! photo[name]) {
// expensive operations to get a user. Ajax for example
photos[name] = photo_from_ajax;
}
return photos[name];
};
Il y a clairement un motif de là, nous allons donc abstraite. Nous allons utiliser memoization.
/**
* @param {Array} store Data structure in which we cache lambda's return values
* @param {Function} lambda
* @return {Function} A function that caches the result of calling the lambda param
*/
var memoize = function (store, lambda) {
// return a new lambda
return function (name) {
if (! store[name]) {
// Execute the lambda and cache the result
store[name] = lambda(name);
}
return store[name];
};
};
var getUsers = memoize([], function (name) {
// expensive operations to get a user. Ajax for example
});
var getPhotos = memoize([], function (name) {
// expensive operations to get a photo. Ajax for example
});
Comme vous pouvez le voir, en utilisant les lambdas, nous avons été en mesure de faire abstraction de la mise en cache/memoization logique. Si pour l'autre exemple, il y avait quelques solutions de contournement, je crois que ce problème est à peine résolu en utilisant d'autres techniques. Nous avons réussi à extraire une partie importante du code réutilisable en un seul endroit. Pour ne pas mentionner que nous sommes débarrassés de l' users
et photos
des variables globales.
Regardant votre profil, je vois que vous êtes plutôt un Python de l'utilisateur. Pour le modèle, Python est le concept de décorateurs. Il y a beaucoup d' exemple sur le net pour memoization décorateurs. La seule différence est que dans Python-vous le plus de chances d'avoir un nommé fonction imbriquée à l'intérieur de cette fonction décorateur. La raison étant que le Python uniquement en charge une seule expression lambda. Mais le concept est le même.
Comme un exemple de Python lambda utilisation. Le code ci-dessus dans laquelle nous avons filtré les même numéros peut être représenté en Python comme ceci:
filter(lambda x: x % 2 == 0, [1, 2, 3, 4])
De toute façon, les lambdas ne sont pas puissants, sans fermetures. Fermetures est ce qui rend le concept de lambdas si puissant. Dans mon memoization exemple, j'ai utilisé des fermetures pour créer une clôture autour de l' store
param. De cette façon, j'ai accès à ce param même après l' memoize
fonction a retourné son résultat (lambda).