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 :
- Tri par prix croissant (ordre naturel — utiliser
Collections.sort()) - Tri par nom alphabétique
- 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 :
estCherPredicate— vrai si le prix est supérieur à 50 $estElectroniquePredicate— vrai si la catégorie est"Électronique"- 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 deifdans une boucle) - La méthode
afficherFiltresdoit être générique dans son usage duPredicate - Le tri par prix croissant doit passer par
Collections.sort()et l'ordre naturel deComparable
Questions de réflexion
- Quelle est la différence entre
ComparableetComparator? 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 deProduitsans avoir implémentéComparable?