Aller au contenu principal

Atelier 13 - Gestionnaire de produits

Créez un programme Java qui gère une liste de produits en utilisant les expressions lambda, les interfaces fonctionnelles et les interfaces Comparable / Comparator.

Spécifications

1. Classe Produit (avec ordre naturel)

Créez une classe Produit qui implémente Comparable<Produit> :

  • Attributs : nom (String), categorie (String), prix (double)
  • Le tri naturel (via Comparable) se fait par prix croissant
  • Redéfinir toString() pour afficher : nom [categorie] - $prix

2. Catalogue de produits

Dans le main, créez une ArrayList<Produit> avec au moins 8 produits de catégories variées (ex : "Électronique", "Vêtements", "Alimentation").

3. Tris avec Comparator (via lambdas)

Implémentez les tris suivants en utilisant des lambdas :

  1. Tri par prix croissant (ordre naturel — utiliser Collections.sort())
  2. Tri par nom alphabétique
  3. Tri par catégorie, puis par prix décroissant à l'intérieur de chaque catégorie

4. Filtrage avec Predicate

Créez et utilisez les prédicats suivants :

  1. estCherPredicate — vrai si le prix est supérieur à 50 $
  2. estElectroniquePredicate — vrai si la catégorie est "Électronique"
  3. Combinaison : afficher les produits électroniques et chers (utiliser .and())

Créez une méthode utilitaire :

static void afficherFiltres(ArrayList<Produit> produits, Predicate<Produit> filtre, String titre)

qui affiche le titre puis tous les produits qui satisfont le prédicat.

5. Transformation avec Function

Créez une Function<Produit, String> nommée versEtiquette qui transforme un produit en une étiquette de format :

ÉTIQUETTE: NOM_EN_MAJUSCULES — $prix

Appliquez cette fonction à chaque produit de la liste et affichez les étiquettes.

6. Affichage avec Consumer

Créez un Consumer<Produit> nommé afficherProduit qui affiche un produit avec le préfixe ">> ".

Utilisez-le avec forEach pour afficher toute la liste après le tri par catégorie/prix.

Exemple d'exécution attendu

=== Tri par prix croissant ===
Pain [Alimentation] - $2.50
T-Shirt [Vêtements] - $19.99
...

=== Tri par nom alphabétique ===
Casque [Électronique] - $89.99
Clavier [Électronique] - $45.00
...

=== Tri par catégorie puis prix décroissant ===
>> Riz [Alimentation] - $5.99
>> Pain [Alimentation] - $2.50
>> Téléphone [Électronique] - $799.99
>> Casque [Électronique] - $89.99
...

=== Produits chers (prix > 50$) ===
Casque [Électronique] - $89.99
Téléphone [Électronique] - $799.99
...

=== Produits électroniques ET chers ===
Casque [Électronique] - $89.99
Téléphone [Électronique] - $799.99

=== Étiquettes ===
ÉTIQUETTE: PAIN — $2.50
ÉTIQUETTE: CASQUE — $89.99
...

Contraintes

  • Les tris doivent utiliser des lambdas (pas de classes séparées)
  • Le filtrage doit utiliser Predicate (pas de if dans une boucle)
  • La méthode afficherFiltres doit être générique dans son usage du Predicate
  • Le tri par prix croissant doit passer par Collections.sort() et l'ordre naturel de Comparable

Questions de réflexion

  • Quelle est la différence entre Comparable et Comparator ? Dans quel cas choisiriez-vous l'un ou l'autre ?
  • Pourquoi Comparator<T> peut-il être passé directement comme lambda ?
  • Que se passerait-il si vous appeliez Collections.sort() sur une liste de Produit sans avoir implémenté Comparable ?