TP sur les expressions lambda et les streams

Page Home (contact) Retour TPs

Support de cours


Tri

Vous allez compléter la méthode main de cette classe 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).
  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 et testez ce code.
  2. Modifiez le code pour utiliser une référence de méthode à la place de l'expression lambda.
  3. En utilisant aussi la méthode reversed() de Comparator, tri décroissant des étudiants par année de promotion.
  4. 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.

Correction :

Question 2
Question 3
Question 4


Premier exemple de stream

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


Retour TPs