{"id":468,"date":"2021-11-02T14:56:25","date_gmt":"2021-11-02T14:56:25","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=468"},"modified":"2022-11-02T14:54:47","modified_gmt":"2022-11-02T14:54:47","slug":"objet-2-les-fonctions-lambda","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/objet-2-les-fonctions-lambda\/","title":{"rendered":"Les fonctions lambda"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>En programmation, l&rsquo;utilisation de variable est un \u00e9l\u00e9ment extr\u00eamement important, autant pour stocker des donn\u00e9es que pour les partager entre les diff\u00e9rentes instances de votre syst\u00e8me. En effet, s&rsquo;il n&rsquo;y avait pas de variables, nous ne pourrions pas transf\u00e9rer des valeurs d&rsquo;un objet \u00e0 un autre en utilisant les assignateurs (\u00ab\u00a0setters\u00a0\u00bb), les constructeurs ou m\u00eame des variables globales. Ces variables peuvent contenir toute sorte de valeurs: des entiers, des conteneurs, des pointeurs, des cha\u00eenes de caract\u00e8res, des objets haut niveau (clients, produits, formes, etc.)<\/p>\n<p>Les fonctions lambda est un principe permettant de stocker une routine (ou une m\u00e9thode dans un contexte objet) dans une variable. De la m\u00eame mani\u00e8re qu&rsquo;une variable contenant toute sorte de valeurs permet de partager ces valeurs d&rsquo;une instance du syst\u00e8me \u00e0 une autre, une fonction lambda permet \u00e9galement de partager une routine d&rsquo;une instance \u00e0 une autre. Cette m\u00e9canique est donc tr\u00e8s int\u00e9ressante pour cr\u00e9er des structures d&rsquo;\u00e9v\u00e9nement, tout en gardant un faible couplage entre les diff\u00e9rents \u00e9l\u00e9ments du syst\u00e8me (par exemple, entre les classes en langage-objet par classes).<\/p>\n<p>Cette m\u00e9canique, bas\u00e9e sur la th\u00e9orie math\u00e9matique \u00ab\u00a0Lambda Calcul\u00a0\u00bb, a \u00e9t\u00e9 cr\u00e9\u00e9e initialement par les langages fonctionnels. Il s&rsquo;agit en fait d&rsquo;un \u00e9l\u00e9ment primordial des langages comme Lisp, Haskell, OCaml, Scheme ou m\u00eame JavaScript. Si vous avez d\u00e9j\u00e0 utilis\u00e9 JQuery avec Javascript, vous avez certainement d\u00e9j\u00e0 fait du code similaire \u00e0 ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"p\">mon_bouton.<\/span><span class=\"nx\">click<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span> <span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alert<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Bonjour tout le monde!\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit ici qu&rsquo;on lance la m\u00e9thode <code>.click(...)<\/code> de la variable <code>mon_bouton<\/code> (m\u00e9thode qui indique \u00e0 Javascript quel code il devra lancer lorsque l&rsquo;utilisateur clique sur le bouton). Le bout de code qui nous int\u00e9resse ici, c&rsquo;est l&rsquo;argument qui est envoy\u00e9 \u00e0 cette m\u00e9thode <code>click<\/code>:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">function<\/span> <span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alert<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Bonjour tout le monde!\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit ici que ce qui est envoy\u00e9 comme valeur d&rsquo;argument \u00e0 la m\u00e9thode <code>.click(...)<\/code> est&#8230; une fonction en tant que telle. La m\u00e9thode <code>.click(...)<\/code> pourra stocker la fonction dans une variable accessible \u00e0 l&rsquo;int\u00e9rieur du bouton et ce dernier pourra lancer la fonction lorsque l&rsquo;utilisateur appuiera sur ce bouton. On voit qu&rsquo;on peut donc cr\u00e9er une structure d&rsquo;\u00e9v\u00e9nement (lancer une certaine routine lorsque l&rsquo;utilisateur clique sur un bouton), sans avoir \u00e0 utiliser de m\u00e9canique de \u00ab\u00a0Listener\u00a0\u00bb comme utilis\u00e9 en Java.<\/p>\n<p>Ce qui est int\u00e9ressant avec cette m\u00e9canique, c&rsquo;est qu&rsquo;elle permet \u00e0 la classe bouton de lancer une m\u00e9thode d&rsquo;une autre classe sans avoir de d\u00e9pendance. En d&rsquo;autres mots, si on a le diagramme suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-10892 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/11\/lambda_dependance_diagramme.png\" alt=\"\" width=\"615\" height=\"123\" \/><\/p>\n<p>On a que le contr\u00f4leur connait le bouton (il a une d\u00e9pendance), mais le bouton ne connait pas le contr\u00f4leur (il est ind\u00e9pendant). Par contre, malgr\u00e9 cette ind\u00e9pendance, le bouton peut tout de m\u00eame lancer une m\u00e9thode du contr\u00f4leur. C&rsquo;est le contr\u00f4leur qui doit ajouter sa m\u00e9thode dans le bouton en utilisant la m\u00e9thode \u00ab\u00a0click\u00a0\u00bb. Le bouton contient, dans une variable, la m\u00e9thode \u00e0 lancer, mais sans savoir dans quelle classe cette m\u00e9thode se trouve.<\/p>\n<p>Cette m\u00e9canique nous permet d&rsquo;avoir les m\u00eames avantages que le patron conceptuel Observeur ou que les Listener, sans avoir les inconv\u00e9nients. En effet, aucune interface (ou classe abstraite) n&rsquo;est n\u00e9cessaire et on peut utiliser n&rsquo;importe quelle m\u00e9thode, peu importe le nom qu&rsquo;on lui donne (contrairement aux Listeners ou aux Observeurs qui imposent le nom des m\u00e9thodes lanc\u00e9s).<\/p>\n<h2>Les Agents en Eiffel<\/h2>\n<p>Dans le langage Eiffel, le lambda calcul est impl\u00e9ment\u00e9 en utilisant le mot cl\u00e9 \u00ab\u00a0agent\u00a0\u00bb. Un \u00ab\u00a0agent\u00a0\u00bb permet de prendre une m\u00e9thode et de la transformer en objet, permettant ainsi de l&rsquo;utiliser comme valeur dans une variable (ou attribut, argument, etc.) L&rsquo;objet cr\u00e9\u00e9e est d&rsquo;un type descendant de <code>ROUTINE<\/code>. Une <code>ROUTINE<\/code> peut \u00eatre autant de types <code>FUNCTION<\/code> ou <code>PROCEDURE<\/code> (ou <code>PREDICATE<\/code>, mais nous ne toucherons pas \u00e0 cette classe dans ce cours). Je rappelle qu&rsquo;une fonction est une routine qui retourne une valeur et une proc\u00e9dure est une routine qui ne retourne pas de valeur.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-10893 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/11\/agent_diagramme.png\" alt=\"\" width=\"433\" height=\"209\" \/><\/p>\n<h3>Les fonctions<\/h3>\n<p>Initialement, nous cr\u00e9ons une m\u00e9thode de mani\u00e8re conventionnelle. Par exemple, voici une m\u00e9thode qui fait une addition de deux nombres et qui retourne la somme:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">addition<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">):<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a<\/span> <span class=\"o\">+<\/span> <span class=\"n\">b<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est important de comprendre que ce n&rsquo;est qu&rsquo;un exemple pour vous faire comprendre la m\u00e9canique des \u00ab\u00a0agents\u00a0\u00bb. Voici maintenant la cr\u00e9ation d&rsquo;une variable de type <code>FUNCTION<\/code> en utilisant un \u00ab\u00a0agent\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">addition<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_addition<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code affichera le r\u00e9sultat suivant:<\/p>\n<pre>Le resultat: 8<\/pre>\n<p>Sachez \u00e9galement que dans les derni\u00e8res versions d&rsquo;EiffelStudio, il est possible d&rsquo;utiliser la variable, comme s&rsquo;il s&rsquo;agissait d&rsquo;une m\u00e9thode en soi. C&rsquo;est-\u00e0-dire que nous pouvons \u00e9viter d&rsquo;utiliser le \u00ab\u00a0item\u00a0\u00bb. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">addition<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>donnera \u00e9galement le r\u00e9sultat:<\/p>\n<pre>Le resultat: 8<\/pre>\n<p>Il est \u00e9galement possible de \u00ab\u00a0pr\u00e9-assigner\u00a0\u00bb des arguments lors de la cr\u00e9ation de l&rsquo;agent. Pour ce faire, nous ajoutons directement les arguments \u00ab\u00a0pr\u00e9-assign\u00e9s\u00a0\u00bb dans la cr\u00e9ation de l&rsquo;agent et nous laissons les autres arguments en utilisant le caract\u00e8re \u00ab\u00a0?\u00a0\u00bb. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_incrementation<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_incrementation<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">addition<\/span><span class=\"p\">(<\/span><span class=\"o\">?<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_incrementation<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le code donnera le r\u00e9sultat suivant:<\/p>\n<pre>Le resultat: 9<\/pre>\n<p>Dans le cas o\u00f9 il n&rsquo;y a pas d&rsquo;argument \u00e0 la <code>FUNCTION<\/code>, on doit utiliser <code>.item([])<\/code> (ou sans le \u00ab\u00a0.item\u00a0\u00bb) pour lancer l&rsquo;ex\u00e9cuter. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_5<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_5<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_5<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">(<\/span><span class=\"o\">[]<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>ou<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_5<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_5<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_5<\/span><span class=\"p\">(<\/span><span class=\"o\">[]<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans les deux cas, nous obtenons le r\u00e9sultat:<\/p>\n<pre>Le resultat: 5<\/pre>\n<h3>Les proc\u00e9dures<\/h3>\n<p>L&rsquo;utilisation d&rsquo;une proc\u00e9dure se fait de la m\u00eame mani\u00e8re, mais en utilisant \u00ab\u00a0.call\u00a0\u00bb au lieu de \u00ab\u00a0.item\u00a0\u00bb et sans valeur de retour.<\/p>\n<p>Par exemple, voici une m\u00e9thode standard que nous utiliserons dans notre exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">afficher_addition<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"La somme est: \"<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span> <span class=\"o\">+<\/span> <span class=\"n\">b<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici comment on utilise la proc\u00e9dure sous la forme d&rsquo;agent:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">afficher_addition<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat du code est:<\/p>\n<pre>La somme est: 8<\/pre>\n<p>On peut \u00e9galement lancer l&rsquo;agent sans utiliser le \u00ab\u00a0.call\u00a0\u00bb. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">afficher_addition<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>De la m\u00eame mani\u00e8re que pour les fonctions, il y a la possibilit\u00e9 de \u00ab\u00a0pr\u00e9-assigner\u00a0\u00bb des arguments en utilisant le caract\u00e8re \u00ab\u00a0?\u00a0\u00bb lors de la cr\u00e9ation de l&rsquo;agent:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">afficher_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"o\">?<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat de ce code est:<\/p>\n<pre>La somme est: 9<\/pre>\n<p>Finalement, toujours de mani\u00e8re similaire au fonction, lorsque nous lan\u00e7ons une proc\u00e9dure sous la forme d&rsquo;agent sans argument, il faut utiliser \u00ab\u00a0.call([])\u00a0\u00bb (avec ou sans le \u00ab\u00a0.call\u00a0\u00bb). Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">afficher_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"o\">[]<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>ou:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"n\">afficher_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_afficher<\/span><span class=\"p\">(<\/span><span class=\"o\">[]<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les agents en ligne<\/h3>\n<p>Il est possible de sp\u00e9cifier directement le code qu&rsquo;ex\u00e9cutera un agent dans la d\u00e9finition de l&rsquo;agent. Voici un exemple avec une fonction:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">):<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t\t\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a<\/span> <span class=\"o\">+<\/span> <span class=\"n\">b<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le resultat: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat donne:<\/p>\n<pre>Le resultat: 8<\/pre>\n<p>Et un autre exemple avec une proc\u00e9dure:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"La somme est: \"<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span> <span class=\"o\">+<\/span> <span class=\"n\">b<\/span><span class=\"p\">).<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"n\">l_addition<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Qui donne le r\u00e9sultat:<\/p>\n<pre>La somme est: 8<\/pre>\n<h3>Les agents de classes<\/h3>\n<p>Il est possible de cr\u00e9er un \u00ab\u00a0agent\u00a0\u00bb \u00e0 partir d&rsquo;une m\u00e9thode de classe. Le premier argument de cette m\u00e9thode est un argument du type de la classe qui contenait la m\u00e9thode \u00e0 l&rsquo;origine.<\/p>\n<p>Par exemple, avec une proc\u00e9dure:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'application<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_to_upper<\/span><span class=\"p\">:<\/span><span class=\"nc\">PROCEDURE<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]]<\/span>\r\n\t\t<span class=\"n\">l_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_to_upper<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"p\">{<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">}.<\/span><span class=\"n\">to_upper<\/span>\r\n\t\t<span class=\"n\">l_texte<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Un Texte\"<\/span>\r\n\t\t<span class=\"n\">l_to_upper<\/span><span class=\"p\">(<\/span><span class=\"n\">l_texte<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">l_texte<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code donne le r\u00e9sultat:<\/p>\n<pre>UN TEXTE<\/pre>\n<p>Ensuite, avec une fonction:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'application<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_head<\/span><span class=\"p\">:<\/span><span class=\"nc\">FUNCTION<\/span><span class=\"o\">[<\/span><span class=\"nc\">TUPLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">,<\/span> <span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_head<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">agent<\/span> <span class=\"p\">{<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">}.<\/span><span class=\"n\">head<\/span>\r\n\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Les 4 premiers caracteres: \"<\/span> <span class=\"o\">+<\/span>\r\n\t\t\t\t<span class=\"n\">l_head<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Bonjour tout le monde\"<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code donne le r\u00e9sultat:<\/p>\n<pre>Les 4 premiers caracteres: Bonj<\/pre>\n<h3>Les m\u00e9thodes d&rsquo;action de boucle<\/h3>\n<p>Il est tr\u00e8s int\u00e9ressant d&rsquo;utiliser les agents dans un contexte de boucle, car \u00e7a permet d&rsquo;encapsuler la boucle \u00e0 l&rsquo;int\u00e9rieur de la classe de liste. En d&rsquo;autres mots, au lieu de faire la boucle nous-m\u00eames, dans notre programme, on indique \u00e0 la liste l&rsquo;action qu&rsquo;on veut ex\u00e9cuter et la liste s&rsquo;occupe d&rsquo;ex\u00e9cuter la boucle.<\/p>\n<p>Il existe 3 m\u00e9thodes d&rsquo;action dans la classe LIST:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>do_all: Permets d&rsquo;ex\u00e9cuter un agent pour chaque \u00e9l\u00e9ment de la liste;<\/li>\n<li>for_all: Test avec une fonction bool\u00e9enne (sous forme d&rsquo;agent) que tous les \u00e9l\u00e9ments retournent Vrai;<\/li>\n<li>do_if: Pour tous les \u00e9l\u00e9ments de la liste, ex\u00e9cute un agent sur un \u00e9l\u00e9ment de la liste, seulement si un test avec une fonction bool\u00e9enne (sous forme d&rsquo;agent) retourne Vrai.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici des exemples d&rsquo;utilisation des m\u00e9thodes d&rsquo;action de liste:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Ligne 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Ligne 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Ligne 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Ligne 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Ligne 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">do_all<\/span> <span class=\"p\">(<\/span><span class=\"kr\">agent<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_string<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">l_string<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code donne le r\u00e9sultat suivant:<\/p>\n<pre>Ligne 1\r\nLigne 2\r\nLigne 3\r\nLigne 4\r\nLigne 5<\/pre>\n<p>Un autre exemple qui permet rapidement de valider les entr\u00e9es des utilisateurs:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'application<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"1\"<\/span><span class=\"p\">)<\/span>\t<span class=\"c1\">-- Simule l'entr\u00e9e de donn\u00e9es<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Allo\"<\/span><span class=\"p\">)<\/span>\t<span class=\"c1\">-- par l'utilisateur<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Bonjour\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">executer_programme<\/span><span class=\"p\">(<\/span><span class=\"n\">l_liste<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"n\">executer_programme<\/span><span class=\"p\">(<\/span><span class=\"n\">a_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Lance le programme seulement si tous les \u00e9l\u00e9ments sont entiers<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">if<\/span> <span class=\"n\">a_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">for_all<\/span> <span class=\"p\">(<\/span><span class=\"kr\">agent<\/span> <span class=\"p\">{<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">}.<\/span><span class=\"n\">is_integer<\/span><span class=\"p\">)<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"c1\">-- Tous les \u00e9l\u00e9ments sont des entiers valides. Proc\u00e9dons<\/span>\r\n\t\t<span class=\"kr\">else<\/span>\r\n\t\t\t<span class=\"n\">a_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">do_if<\/span> <span class=\"p\">(<\/span><span class=\"kr\">agent<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_string<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"La valeur: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_string<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" n'est pas un entier valide%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t\t\t\t<span class=\"p\">,<\/span> <span class=\"kr\">agent<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_string<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">):<\/span><span class=\"nc\">BOOLEAN<\/span>\r\n\t\t\t\t\t\t\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">a_string<\/span><span class=\"p\">.<\/span><span class=\"n\">is_integer<\/span>\r\n\t\t\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t\t\t<span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h2>Les lambdas en Java<\/h2>\n<p>Le langage Java a \u00e9galement sa version des fonctions lambda. Malheureusement, tr\u00e8s peu de m\u00e9canismes inclue dans les librairies de base de java utilisent ou permette l&rsquo;utilisation des fonctions lambda. La raison pour cette absence est que les fonctions lambda ont fait leur apparition dans le langage Java \u00e0 partir de la version 8 et que les librairies de bases ont \u00e9t\u00e9 faites bien avant cette version.<\/p>\n<p>De plus, les fonctions lambda en Java sont beaucoup moins structur\u00e9es que ce que nous avons vu en Eiffel avec les \u00ab\u00a0agents\u00a0\u00bb. En effet, l&rsquo;impl\u00e9mentation des fonctions lambda en Java est bas\u00e9e sur le principe des langages fonctionnels qui ne sont g\u00e9n\u00e9ralement pas typ\u00e9s. Donc, le syst\u00e8me de fonctions lambda en Java ne respecte pas le paradigme de programmation orient\u00e9e objet par classe, mais bien celui de programmation orient\u00e9e objet par prototype. En d&rsquo;autres mots, il n&rsquo;y a pas de classe telle que <code>Methode<\/code>, <code>Procedure<\/code> ou <code>Function<\/code> g\u00e9n\u00e9r\u00e9 \u00e0 partir de la syntaxe des lambdas en Java. Un lambda g\u00e9n\u00e8re d&rsquo;une certaine fa\u00e7on un objet qui n&rsquo;a pas de type. Inversement, afin de faire en sorte que ces fonctions lambda soient utilisables avec le reste du langage Java, les concepteurs ont fait en sorte que les fonctions lambda peuvent g\u00e9n\u00e9rer des objets qui se conforment \u00e0 certaines interfaces.<\/p>\n<p>Pour cr\u00e9er une fonction lambda, il faut utiliser la syntaxe:<\/p>\n<pre>(TypeArgument1 argument1, TypeArgument2 argument2, ...) -&gt; code<\/pre>\n<p>Voici un exemple. Premi\u00e8rement, prenons la classe Personne suivante qui nous servira dans notre exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setAge<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">age<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getAge<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">age<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Personne<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">setAge<\/span><span class=\"p\">(<\/span><span class=\"n\">aAge<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Ensuite, prenons le programme suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">CheckPersonne<\/span> <span class=\"p\">{<\/span>\r\n       <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">test<\/span><span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">aPersonne<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> \r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Programme<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">CheckPersonne<\/span> <span class=\"n\">ma_lambda<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">p<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"na\">getAge<\/span><span class=\"p\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">18<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">Personne<\/span> <span class=\"n\">personne1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Personne<\/span><span class=\"p\">(<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Alice\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Personne<\/span> <span class=\"n\">personne2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Personne<\/span><span class=\"p\">(<\/span><span class=\"mi\">900<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Yoda\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">ma_lambda<\/span><span class=\"p\">.<\/span><span class=\"na\">test<\/span><span class=\"p\">(<\/span><span class=\"n\">personne1<\/span><span class=\"p\">)){<\/span>\r\n            <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">personne1<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" a plus de 18 ans\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">ma_lambda<\/span><span class=\"p\">.<\/span><span class=\"na\">test<\/span><span class=\"p\">(<\/span><span class=\"n\">personne2<\/span><span class=\"p\">)){<\/span>\r\n            <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">personne2<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" a plus de 18 ans\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">new<\/span> <span class=\"n\">Programme<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit ici que la fonction lambda est plac\u00e9e dans une variable de Type <code>CheckPersonne<\/code> qui contient la fonction <code>test()<\/code>. Pour utiliser la fonction lambda, nous devons utiliser cette fonction <code>test()<\/code>. Le r\u00e9sultat de ce code donnera:<\/p>\n<pre>Yoda a plus de 18 ans.<\/pre>\n<p>On peut varier le type de retour de la fonction lambda en modifiant l&rsquo;interface et en faisant en sorte que la lambda retourne le bon type. On peut \u00e9galement cr\u00e9er une fonction lambda qui ne retourne aucune valeur. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">PrintPersonne<\/span> <span class=\"p\">{<\/span>\r\n       <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">aPersonne<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> \r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Programme<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">PrintPersonne<\/span> <span class=\"n\">ma_lambda<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">p<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"s\">\"L'age de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" est de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"na\">getAge<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" ans.\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Personne<\/span> <span class=\"n\">personne1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Personne<\/span><span class=\"p\">(<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Alice\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ma_lambda<\/span><span class=\"p\">.<\/span><span class=\"na\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">personne1<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">new<\/span> <span class=\"n\">Programme<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat de ce programme code est:<\/p>\n<pre>L'age de Alice est de 7 ans.<\/pre>\n<h3>Lambda sur des listes<\/h3>\n<p>Un peu comme dans le cas des actions de boucle dans Eiffel, il est possible d&rsquo;utiliser les lambdas dans le contexte d&rsquo;une liste afin d&rsquo;indiquer \u00e0 la liste une action \u00e0 effectuer sur chaque \u00e9l\u00e9ment de la liste. Pour ce faire, on utilise la m\u00e9thode <code>forEach<\/code> contenue dans toutes les <code>List<\/code>. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">printPersonne<\/span><span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">aPersonne<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"L'age de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aPersonne<\/span><span class=\"p\">.<\/span><span class=\"na\">getNom<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" est de \"<\/span> <span class=\"o\">+<\/span> \r\n                <span class=\"n\">aPersonne<\/span><span class=\"p\">.<\/span><span class=\"na\">getAge<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" ans.\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Programme<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Personne<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lPersonnes<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Personne<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lPersonnes<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Personne<\/span><span class=\"p\">(<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Alice\"<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lPersonnes<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Personne<\/span><span class=\"p\">(<\/span><span class=\"mi\">900<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Yoda\"<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lPersonnes<\/span><span class=\"p\">.<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"p\">(<\/span><span class=\"n\">Personne<\/span> <span class=\"n\">p<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">printPersonne<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span><span class=\"p\">));<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">new<\/span> <span class=\"n\">Programme<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat de cet exemple est:<\/p>\n<pre>L'age de Alice est de 7 ans.\r\nL'age de Yoda est de 900 ans.<\/pre>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/les-cours\/programmation-orientee-objet-2\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction En programmation, l&rsquo;utilisation de variable est un \u00e9l\u00e9ment extr\u00eamement important, autant pour stocker des donn\u00e9es que pour les partager entre les diff\u00e9rentes instances de votre syst\u00e8me. En effet, s&rsquo;il n&rsquo;y avait pas de variables, nous ne pourrions pas transf\u00e9rer des valeurs d&rsquo;un objet \u00e0 un autre en utilisant les assignateurs (\u00ab\u00a0setters\u00a0\u00bb), les constructeurs ou&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/objet-2-les-fonctions-lambda\/\">Continue reading <span class=\"screen-reader-text\">Les fonctions lambda<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-468","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=468"}],"version-history":[{"count":11,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/468\/revisions"}],"predecessor-version":[{"id":758,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/468\/revisions\/758"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}