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

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

java-9.jpg 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.

tutoriel-lambda-comparator-avant-apres-java-8-0

Expliquez

TELECHARGER LE PROJET INITIAL

demolambdaComparator-v1

Exécutez

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é.

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.

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 :

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

tutoriel-lambda-comparator-avant-apres-java-8-04

ajoutons notre implémentation :

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

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 :

tutoriel-lambda-comparator-avant-apres-java-8-08

 

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

tutoriel-lambda-comparator-avant-apres-java-8-10

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

tutoriel-lambda-comparator-avant-apres-java-8-11

Ajoutez l’opérateur lambda.

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.

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 :

tutoriel-lambda-comparator-avant-apres-java-8-13

Ce qui simplifie encore notre code.

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’.

tutoriel-lambda-comparator-avant-apres-java-8-13ter

 

tutoriel-lambda-comparator-avant-apres-java-8-15

Version finale

demolambdaComparator-v2

Aller plus loin

Analysez le code suivant

4-techniques-tri-java-8

Expliquez.

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 :

streams-demo1.png

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 !

java-9.jpg
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 !

2018-01-25T07:26:49+01:00

Contactez nous

241 rue DUGUESCLIN, 69003 Lyon

Web : Objis : spécialiste formation Java