Les lambda fonctions en PHP … ou comment en arriver à discuter du futur de Java … (épisode 1)

Oxiane est une société de vieux développeurs Objets. Ils n’écrivent pas beaucoup d’articles sur ce blog mais ils utilisent beaucoup la killer application qui a fait Internet : le mail … Comme ils racontent des choses assez intéressantes, je vais vous retranscrire sous forme de discussion leur point de vue sur Java, Scala, PHP et Co.

Alors tout est parti d’un petit post de votre serviteur à propos d’un langage qui m’intéresse depuis longtemps : PHP.
.
.
.

Imaginons le code suivant :

$personnes[] = new Personne("Alain","Boudard") ;
$personnes[] = new Personne("Mikaël","Le Ster") ;
$personnes[] = new Personne("Jean-François","Lefevre") ;
$personnes[] = new Personne("Bruno","Leroux") ;
$personnes[] = new Personne("Stéphane","Liétard") ;
$personnes[] = new Personne("Guillaume","Rams") ;
$personnes[] = new Personne("Jean-Louis","Rousselin") ;

Comme vous êtes malins mais qu’il ne faut pas pousser, on suppose que sur la classe Personne, on a un constructeur qui prend en paramètre le prénom et le nom.
On va même dire qu’on a un accesseur getNom() sur cette même classe Personne.

Oui mais comment fait-on pour construire un tableau avec tous les noms de notre liste de personnes ?

Eh bien, en PHP, on peut écrire ça :

$noms = array_map(create_function('$v','return $v->getNom();'), $personnes) ;

Si on lance un debug et qu’on regarde le nom de la fonction « anonyme » créée, on verra qu’elle se nomme __lambda_func().
PHP supporte les lambda fonctions, génial !

Dans un autre langage, on aurait écrit

noms .= personnes collect: [ :v | v nom ].

Ce que je trouve encore plus lisible intuitivement.
Ici, le code entre crochets s’appelle un BlockClosure. C’est une instance de la classe de même nom … car tout est objet.
Mais je m’égare

Ce qui est important c’est qu’on peut écrire une fonction à la volée, anonyme, avec des paramètres et s’en servir, voir la réutiliser ou la passer elle même en paramètre …

J’aurais par exemple pu écrire

$collectNom = create_function('$v','return $v->getNom();') ;
$noms = array_map($collectNom, $personnes) ;

et ainsi réutiliser ma lambda-fonction à travers la variable $collectNom.

A partir de là, cela m’intéresse beaucoup de savoir comment on fait pour faire -de la façon la plus proche, compacte, lisible et réutilisable- à peu près la même chose en java.
Moi personnellement, j’aurais écris quelque chose comme …

Collection<String> noms = new ArrayList<String>() ;
foreach (Collection<Personne> personnes : personne){
  noms.add(personne.getNom()) ;
}

Mais je n’ai pas de lambda fonction …

… (à suivre)

Stéphane Liétard