Tutoriel JAVA N°18 : Expression Lambda et tri avec Java 8

JPG - 15.4 ko

Avec Objis, spécialiste Java depuis 2005, découvrez l’opérateur Lamba introduit dans Java 8. Constatez par la pratique que l’expression lambda simplifie la lecture et la maintenance du code impliquant une classe anonyme. Découvrez le lien entre Expression Lambda, classe anonyme et interface fonctionnelle. Comprenez la notion de Référence de méthode. Allez plus loin avec les Streams et combinez Streams et expression Lambda.

ASTUCE —> Soyez informé de la mise à jour ou création de tutos sur objis.com.

Auteur

- Douglas MBIANDOU. Président Objis . Concepteur formation ’Nouveautés Java 8 et 9’

Prérequis

- Développer en Java

Objectifs

- Constater la difficulté de coder ’simplement’ le tri d’une liste d’objets avant Java 8 : solution par (classe dédiée ou classe anonyme)
- Comprendre l’opérateur lambda (->)
- Comprendre le lien entre Expression Lambda et classe anonyme et interface fonctionnelle
- Solution avec Java 8 via Interface fonctionnelle Comparator et Expression Lambda
- Introduire les Streams et la combinaison Streams / Expression lambda

Programme

- Partie 1 : projet initial
- Partie 2 : trier avant Java 8
- Partie 3 : classe anonyme et expression Lambda
- Partie 4 : optimisations
- Conclusion
- Votre avis nous interesse

Durée

- 25 min

Partie 1 : projet initial

- Analysez le code suivant.

PNG - 22.7 ko
tutoriel-lambda-comparator-avant-apres-java-8-0

- Expliquez

TELECHARGER LE PROJET INITIAL

Zip - 4.2 ko
demolambdaComparator-v1

- Exécutez

PNG - 4.3 ko
tutoriel-lambda-comparator-avant-apres-java-8-00

Partie 2 : trier avant Java 8

Nous souhaitons trier la liste des personnes par ordre alphabétique.

La classe java.util.Collections fournit la méthode statique sort pour trier une collection suivant un critère donné.

PNG - 10.5 ko
tutoriel-expression-lambda-tri-collections-sort

La méthode existe en deux version.
— > Une version avec un seul paramètre (la collection) et imposant donc la stratégie de tri.

— > Une version avec deux paramètres : la collection, et le critère de tri.

C’est cette deuxième version qui nous convient.

PNG - 10 ko
tutoriel-lambda-comparator-avant-apres-java-8-01

Ci-dessus ligne 15 (commentée) le type de code que nous aimerions bien écrire de façon naturelle : les point d’interrogations mette en évidence notre critère de comparaison.

En adoptant la stratégie de comparaison par défaut (interface comparable) et en se basant sur la comparaison des noms d’une personne, on crée une méthode qui compare les noms de Personne :

PNG - 26.5 ko
tutoriel-lambda-comparator-avant-apres-java-8-02

On aimerait bien pouvoir passer la méthode compare() en second argument à Collections.sort(personnes, xxxx). MAIS pas possible avant Java 8 ! —> on ne peut passer une méthode en paramètre d’une méthode —> On DOIT créer classe implémentant interface Comparator

— > OK. Alors on crée ici classe ComparaPersonneParNom

PNG - 11.9 ko
tutoriel-lambda-comparator-avant-apres-java-8-04

- ajoutons notre implémentation :

PNG - 12.4 ko
tutoriel-lambda-comparator-avant-apres-java-8-05

- 

On aimerait bien pouvoir passer directement la classe ComparaPersonneParNom en paramètre de sort. MAIS pas possible avant Java 8 ! —> ON DOIT instancier la classe car la méthode sort prend une instance

- Analysez le code ci-dessous ligne 26

PNG - 23.8 ko
tutoriel-lambda-comparator-avant-apres-java-8-07

Nous venons de mettre en oeuvre une stratégie de tri classique avant Java 8

Partie 3 : classe anonyme et expression Lambda

Le code précédent necessite la création d’une classe spécifique pour la comparaison.

Serait-il possible de s’en sortir sans cette claase supplémentaire, tout en ayant un code ’lisible’, ’maintenable’ ?

- Analysez le code ci-dessous :

PNG - 8.4 ko
tutoriel-lambda-comparator-avant-apres-java-8-08

- 

PNG - 9.5 ko
tutoriel-lambda-comparator-avant-apres-java-8-09

Ici on passe par une classe anonyme donc. Le code n’est pas très lisible, n’est ce pas ? Nous allons progressivement le rendre plus ’lisible’ grace aux expressions lamda.

- Selectionnez le code comme ci-dessous

PNG - 6.8 ko
tutoriel-lambda-comparator-avant-apres-java-8-10

- Supprimez la sélection. Le compilateur n’est pas content...

PNG - 6 ko
tutoriel-lambda-comparator-avant-apres-java-8-11

- Ajoutez l’opérateur lambda.

PNG - 4.8 ko
tutoriel-lambda-comparator-avant-apres-java-8-12

Le compilateur est content !

L’utilisation de l’opérateur lambda a été possible parce que Comparator est une interface fonctionnelle , annotée dans la javadoc avec @FunctionalInterface.

PNG - 16.3 ko
tutoriel-lambda-comparator-avant-apres-java-8-14

Partie 4 : optimisations

On peut aller plus loin. Le compilateur sait que nous travaillons avec une liste de...Personne. Donc on peut écrire :

PNG - 4.7 ko
tutoriel-lambda-comparator-avant-apres-java-8-13

Ce qui simplifie encore notre code.

PNG - 2.9 ko
tutoriel-lambda-comparator-avant-apres-java-8-13bis

Comme le code ne représente qu’une seule ligne on peut enlever les accolades et le mot clé ’return’.

PNG - 3.2 ko
tutoriel-lambda-comparator-avant-apres-java-8-13ter

- 

PNG - 4.6 ko
tutoriel-lambda-comparator-avant-apres-java-8-15

Version finale

Zip - 9.7 ko
demolambdaComparator-v2

Aller plus loin

- Analysez le code suivant

PNG - 46.8 ko
4-techniques-tri-java-8

- Expliquez.

Zip - 9.7 ko
demolambdaComparator-v3

expression lambda et Streams en java 8

Avec les expressions lambda, les streams sont l’autre valeur ajoutée majeure de Java 8. Toujours ddans un souci de simplifier le langage, les streams vous font passer de la programmation impérative (votre code répond à deux question : QUOI et COMMENT ?) à la programmation déclarative (votre code répond à une question : QUOI).

- Analysez le code suivant :

PNG - 51.6 ko

- Expliquez.

Conclusion

Dans ce tutoriel, vous avez progressivement fait évoluer un code version ’avant Java 8’ en un code compatible Java 8 utilisant les expressions lambda.

Les expressions lambda améliorent la lisibilité, la maintenabilité et la concision de code. Particulièrement adapté lors d’utilisation de classe anonymes impliquant une interface fonctionnelle .

Votre avis nous intéresse

Vous avez remarqué une erreur ? Vous avez une recommandation pour améliorer ce tuto ? Vous souhaitez nous encourager à partager notre savoir-faire technique et pédagogique ?

Donner votre avis sur ce Tuto objis.com

Liens utile

- Compare.comparing
- JM Doudoux : Expressions lambdas

Professionnels : maîtrisez les nouveautés Java 8 et 9 !

JPG - 15.4 ko

A travers notre nouvelle formation Nouveautés Java 8 et 9 (durée 4 jours) conçue par l’auteur de ce tutoriel, découvrez par la pratique le nouveau système de Modules Java 9 ainsi que des caractéristiques de Java 8 (Streams, Lambda, Optional...).

Un sérieux atout pour votre employabilité et l’évolution de votre carrière professionnelle !