TP sur les expressions lambda et les streams

Page Home (contact) Retour TPs

Support de cours


Pour se chauffer...

Dans la méthode main d'une classe Main initialisez un tableau de nombres entiers avec les premiers nombres impairs, en utilisant la méthode setAll de java.util.Arrays, et une expression lambda en paramètre qui donne la valeur du ième élément du tableau en fonction de i.

Par exemple si le tableau est de taille 3, il contiendra les nombres 1, 3, 5.

Pour tester faites afficher les éléments du tableau en utilisant la méthode Arrays.toString.

Correction :

Classe Main

Tri

Vous allez compléter la méthode main de cette classe Main pour trier la liste de villes. Vous ne devez pas modifier le code de la classe Ville.

  1. Tri par ordre alphabétique des noms des villes avec un Comparator. Utilisez la classe Collections (ne l'utilisez pas pour les 2 questions suivantes).
  2. Tri par ordre alphabétique inverse des noms des villes avec une expression lambda (il suffit de prendre l'opposé de l'expression utilisée pour la comparaison dans la question précédente).
  3. Tri par ordre croissant des nombres d'habitants des villes avec une expression lambda.

Correction :

Méthode main


Tri avancé

Vous allez compléter la méthode main de cette classe pour trier la liste d'étudiants. Vous ne devez pas modifier le code de la classe Etudiant.

  1. Voici une portion de code qui effectue un tri croissant des étudiants par année de promotion :
    etudiants.sort(Comparator.comparing(e -> e.getAnPromo()));
    Étudiez la javadoc de la méthode comparing de l'interface Comparator et testez ce code. La méthode comparing retourne un comparateur qui compare suivant la valeur retournée par l'expression lambda.
  2. Puisque la fonction qui retourne la valeur de comparaison retourne un nombre entier, il vaut mieux utiliser (meilleures performances) comparingInt à la place de comparing. Tester le bon fonctionnement.
  3. Modifiez le code pour utiliser une référence de méthode à la place de l'expression lambda.
  4. En utilisant aussi la méthode reversed() de Comparator, tri décroissant des étudiants par année de promotion. Testez d'abord avec la référence de méthode, puis testez avec l'expression lambda de la première question. Remarque : pour l'expression lambda, vous serez peut-être obligé de déclarer le type de la variable de l'expression lambda.
  5. En utilisant aussi la méthode thenComparing de Comparator, tri décroissant des étudiants par année de promotion, et pour chaque année de promotion, tri croissant par moyenne. Donnez une solution avec des expressions lambda et une solution avec des références de méthode. Est-ce qu'il n'existe pas une meilleure méthode que thenComparing dans l'interface Comparator (pensez à ce que vous avez fait dans la question 2).

Correction :

Question 3
Question 4
Question 5


Opérations intermédiaires des streams

Avec la classe Etudiant, on veut faire afficher la meilleure moyenne des étudiants de la promotion de l'année 2013.

L'idée du code :

double max = etudiants
  .filter(e -> e.getAnPromo() == 2013)
  .map(e -> e.getMoyenne())
  .max();

Mais on a vu en cours qu'il faut passer par les streams pour utiliser les expressions lambda pour filtrer ou faire un "mapping". On remplace donc le code par celui-ci :

double max = etudiants.stream()
  .filter(e -> e.getAnPromo() == 2013)
  .map(e -> e.getMoyenne())
  .max();

Testez en complétant ce code. Vous comprenez le message d'erreur ? Corrigez le code. Si vous ne voyez pas, lisez ces indications.

Correction :

Code corrigé
Test


Capture de paramètres

Écrivez une méthode qui retourne la meilleure moyenne des étudiants d'une promotion dont l'année est passée en paramètre (la liste des étudiants est aussi passée en paramètre). Testez.

Montrez que le paramètre doit être effectivement final pour que le code compile.

Correction :

Capture


Opérations terminales pour les streams, collect et reduce

max est une opération terminale de type "reduce" (produit une nouvelle valeur après chaque traitement d'un élément du stream). Nous allons écrire une expression lambda qui utilise une opération terminale de type "collect" (les informations sont collectées dans un container).

Vous allez utiliser la classe Etudiant. Testez en complétant ce code.

Écrivez un méthode qui prend en paramètre une liste d'étudiants, une année de promotion et une valeur de type double et qui retourne une liste des étudiants qui ont une moyenne supérieur à la valeur de type double passée en paramètre. De plus cette liste retournée sera triée par moyenne décroissante. Vous utiliserez pour cela des expressions lambda et des streams.

Si vous n'y arrivez pas aisément, commencez par récupérer tous les étudiants d'une promotion dans une liste. Testez. Ensuite récupérez seulement ceux qui ont une moyenne supérieure à une certaine moyenne (avant de récupérer les étudiants dans une liste il faut les filtrer). Ensuite vous triez la liste par moyenne croissante et finalement par moyenne décroissante.

Correction :

Collect


Pour ceux qui ont déjà fini...

Tutoriel Oracle sur les expressions lambda

Exercices donnés dans le MOOC Oracle sur les expressions lambda


Retour TPs