Utiliser les lambda expressions en Java

Objectifs : L'objectif de ce TP est de vous faire expérimenter avec les interfaces fonctionnelles standard de Java8+ (package java.util.function) et de vous familiariser à leur utilisation au travers de lambda expressions.

1. Récupération et installation du projet pour le TP

  1. Téléchargez le fichier tp15-lambda.zip, décompressez le et ouvrez le répertoire tp15-lambda avec VSCode. il s'agit d'un projet java (sans outils de build) dont la structure est la suivante

    le contenu de tp15-lambda
  2. Explorez les différentes classes Java qui correspondent au code utilisés dans le cours d'introductions aux expressions lambda.

  3. Exécutez le programme Studs4.java qui permet d'afficher une liste d'étudiants en appliquant deux filtres différents :

    • un premier filtre ne conservant que les étudiants étrangers
    • un deuxième filtre ne conservant que les étudiantes

    Le programme est réalisé en utilisant un fonction displayStudents d'ordre supérieur prenant en paramètre une fonction de filtrage dont le type est défini par l'interface fonctionnelle StudentFilter.

2. Utiliser les interfaces fonctionnelles standards

Exeercice 1 : Filtrage et affichage d'une liste d'étudiants

  1. Créez une copie de la classe Studs4.java que vous renomerez Studs5.java

  2. Modifiez le code de cette nouvelle classe afin de remplacer l'interface fonctionnelle spécifique StudentFilter par l'une des interfaces standards proposées par le package java.util.function. A vous de chosir celle qui vous semble la plus appropriée.

  3. Exécutez votre programme et vérifiez que vous obtenez bien un résultat identique à celui produit par le programme Studs4.

Exercice 2 : Paramétrage de l'affichage lors du filtrage

  1. Créez une copie de la classe Studs5.java que vous renomerez Studs6.java

  2. Modifiez le code de cette nouvelle classe afin de pouvoir afficher :

    • le nom, prénom et âge des étudiants suisses
    • le nom, prénom, nationalité, âge des étudiantes de plus de 25 ans

    Vous ne devez pas introduire de nouvelle fonction mais simplement modifier la fonction displayStuds et les lambda expression fournies lors des appels de celle-ci. De même vous ne devez pas introduire de nouvelle interface fonctionnelle mais uniquement utiliser les interfaces fonctionnelles standard de java.util.function.

  3. Exécutez votre programme et vérifiez que vous obtenez bien un résultat attendu.

3. Capture d'une variable par une fonction lambda

De manière similaire à ce qui est fait avec les fonctions fléchées en JavaScript, les lambda expressions Java peuvent peuvent capturer des variables (i.e. accéder à des variables locales ou des paramètres du bloc englobant) à condition qu'elles soient finales (ou explicitement finales, c'est à dire non modifiées après leur affectation). Vous allez expérimenter cette possibilité dans l'exercice suivant

Exercice 3 : filtrer sur l'age en permettant à l'utilisateur de fixer la valeur de l'age.

  1. Créez une copie de la classe Studs6.java que vous renomerez Studs7.java

  2. Modifiez le code afin l'affichage la liste des étudiantes puisse être effectué selon un age dont la valeur est saise au clavier par l'utilisateur.

  3. Exécutez votre programme et vérifiez que vous obtenez bien un résultat attendu

4. Vers encore plus de généricité

le programme Pets.java peremt de filtrer et d"afficher des listes d'animaux domestiques (chiens, chats, chevaux...). Il utilise pour cela une méthode displayPets très similaire à la méthode displayStuds utilisée pour l'affichage des étudiants.

Exercice 4 : une seule méthode pour filtrer et afficher.

  1. Créez une classe DisplayUtils.java dans laquelle vous écrirez une méthode statique générique peremttant de filter et d'afficher de manière indifférenciée des etudiants (objets Student) ou des animaux de compagnie (objets Student)

  2. Créez une copie de la classe Studs7.java que vous renomerez Studs8.java

    • Supprimez dans Studs8.java la déclaration de la méthode displayStuds et remplacez les appels à cete dernière par des appels à la fonction générique que vous avez écrite dans DisplayUtils.java
    • Exécutez Studs8 et vérifiez que vous obtenez bien un résultat attendu
  3. Procédez de même avec la classe Pets