:: Enseignements :: Licence :: L3 :: 2020-2021 :: Programmation Objet avec Java ::
[LOGO]

Encore un peu de streams, record et interfaces


Exercice 1 - Hôtels et Appartements

Le but de ce premier exercice est d'implanter une classe AssetManager permettant de gérer des hôtels (Hotel) et des Appartements (Apartment).
Toutes les classes créées doivent être créées dans le package fr.umlv.monopoly.

  1. Ecrire une classe Hotel définie par un nombre de chambres à louer (rooms) ainsi qu'une valeur d'efficacité (efficiency) correspondant au taux d'occupation de l'hôtel (donc une valeur en pourcentage entre 0 et 1).
    La méthode d'affichage d'un hôtel doit afficher "Hotel" suivi du nombre de champs et de l'efficacité tel que le code suivant fonctionne
         var hotel = new Hotel(5, 0.75);
         System.out.println(hotel);  // Hotel 5 rooms 0.75
        

    Note: attention à ne pas permettre de créer des objets Hotel invalides.
  2. Ecrire une classe Apartment définie par un entier area indiquant le nombre de m2 de l'appartement ainsi qu'une liste de personnes vivant dans l'appartement. Il y a au moins une personne par appartement.
    La méthode d'affichage d'un appartement doit afficher "Apartment" suivi du nombre de m2 puis du nom de chaque personne séparée par des virgules et enfin du pourcentage d'efficacité. Le nombre de personnes dans un appartement ne doit pas changer, pour un appartement donné (pratiquement, cela veut dire que l'on supprime l'appartement pour en créer un nouveau si les personnes d'un appartement changent). Le pourcentage d'efficacité est 0.5 si il y a une personne et 1.0 si il y a plus d'une personne.
    Voici un exemple
         var apartment = new Apartment(30, List.of("Bony", "Clyde"));
         System.out.println(apartment); // Apartment 30 m2 with Bony, Clyde 1.0
        

    Note: attention à ne pas permettre de créer des objets Apartment invalides.
    Note2: pour afficher les noms des personnes séparés par des virgules, utiliser un Stream et un appel à Collectors.joining().
  3. Vérifier que le code suivant ne permet pas de créer un appartement vide en ajoutant une copie défensive à votre code si vous ne l'avez pas déjà fait.
         var list = new ArrayList<String>();
         list.add("Bob");
         var apartment2 = new Apartement(50, list);
         list.remove("Bob");
         System.out.println(apartment2);  // Apartment 50 m2 with Bob 0.5
        

    Note: une copie défensive sur une List se fait en utilisant List.copyOf.
  4. Ecrire la classe AssetManager telle que le code suivant affiche le profit par nuit qui est la somme des prix par nuits des hôtels et des appartements
         var hotel = new Hotel(5, 0.75);
         var apartment = new Apartment(30, List.of("Bony", "Clyde"));
         var manager = new AssetManager();
         manager.add(hotel);
         manager.add(apartment);
         System.out.println(manager.profitPerNight());  // 415
        
    sachant que le prix par nuit pour un appartement est 20 euros par personne et que le prix par nuit pour un hôtel est 100 euros par chambre multiplié par l'efficacité.
    Note: attention, il ne doit pas être possible de créer un objet AssetManager invalide.
    Note2: utiliser un Stream pour écrire la méthode profitPerNight.
  5. On souhaite maintenant que lorsqu'on affiche un AssetManager les appartements et les hôtels qu'il contient soient affichés, un par ligne, dans le même ordre que l'ordre des appels à add.
    Par exemple
         var hotel = new Hotel(5, 0.75);
         var apartment = new Apartment(30, List.of("Bony", "Clyde"));
         var manager = new AssetManager();
         manager.add(hotel);
         manager.add(apartment);
         System.out.println(manager); // affiche
         // Hotel 5 rooms 0.75
         // Apartment 30 m2 with Bony, Clyde 1.0
        

    Note: utiliser un Stream dans votre implantation.
  6. On souhaite ajouter une méthode lowestEfficiency qui renvoie une liste des apartements et des hôtels qui ont une efficacité inférieure ou égale à une valeur d'efficacité passée en paramètre.
    Ecrire la méthode lowestEfficiency telle que le code suivant fonctionne
         var hotel = new Hotel(5, 0.75);
         var apartment = new Apartment(30, List.of("Bony", "Clyde"));
         var manager = new AssetManager();
         manager.add(hotel);
         manager.add(apartment);
         System.out.println(manager.lowestEfficiency(0.8));  // [Hotel 5 rooms 0.75]
        

    Note: utiliser un Stream pour implanter la méthode lowestEfficiency.
  7. On souhaite enfin ajouter la méthode remove qui permet de supprimer les appartements et les hôtels dont l'efficacité est inférieure ou égale à une valeur d'efficacité passée en paramètre.
    Par exemple, le code suivant devra fonctionner
         var hotel = new Hotel(5, 0.75);
         var apartment = new Apartment(30, List.of("Bony", "Clyde"));
         var manager = new AssetManager();
         manager.add(hotel);
         manager.add(apartment);
         manager.remove(0.8);
         System.out.println(manager);  // affiche
         // Apartment 30 m2 with Bony, Clyde 1.0
        

    Note: il existe une méthode removeIf sur l'interface java.util.List.

Exercice 2 - Games Of Streams

Le fichier StreamsTest.java déclare des méthodes avec en commentaire ce qu'elles doivent produire comme résultat.
Utilisez l'API java.util.stream.Stream pour les implémenter.