Copy of https://perso.isima.fr/loic/java/exo_jse_base_houzehou.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[JavaSE] Houzehou

 Cette page commence à dater. Son contenu n'est peut-être plus à jour. Contactez-moi si c'est le cas!

Date de première publication : 2018/01/29

Notions : Définition de classes, Manipulations de chaines et de fichiers, conteneurs, collections et streams

Nous allons créer un annuaire non exhaustif des personnes ayant créé un langage de programmation.

exemple de resultat

Mise en place de quelques classes

Java 8 introduit un nouveau package java.time qui définit une classe Year...

Si vous choisissez l'appel de constructeur à partir d'un autre constructeur, vous devez choisir quel constructeur appelle l'autre. Pour moi, il est plus logique que le constructeur avec moins d'arguments appelle le constructeur qui initialise tous les paramètres - ce dernier peut être private si nécessaire.

La méthode toString() est héritée d’Object. Son comportement par défaut est de donner le nom de la classe et l'adresse mémoire un code de hachage de l’instance concernée.

Si vous codez une concaténation de String, "a"+"b", le compilateur transforme automatiquement avec un StringBuilder MAIS cela reste une bonne idée de le faire et de savoir faire car dans d'autres situations, le compilateur ne saura pas optimiser.

Gestion de fichiers et de plusieurs instances d’une même classe

Manipulation d'un fichier texte

On peut par exemple chaîner des objets de type File, FileOutputStream puis PrintStream.

Il faut également gérer les exceptions possibles avec double bloc try/catch ou un try-with-resources si vous le pouvez.

try(R1 r1 = new R1(); R2 r2 = new R2()) {
  // code utilisant les ressources
} // fermeture automatique des ressources
catch (Exception e) {
  
}

On va maintenant s’intéresser à la lecture de ce fichier par une classe Whoswho, un conteneur d’instances de Personne.

Cela ne crée pas d’instance car c’est un tableau de références. Créer un tableau d’objets en C++ crée autant d’objets que nécessaire en faisant appel au constructeur par défaut de la classe.

Sérialisation

L'étape la plus délicate pour la "sérialisation" XML est l'ajout de la bilbilothèque spécifique (sous forme de fichier jar) lors des étapes de compilation/exécutation que ce soit à la main ou dans l'EDI. La méthode est décrite dans la FAQ Eclipse.

Pour la compilation ou l'exécution à la main, il faut "inclure" le fichier jar dans la liste des classes disponibles :


javac -cp xstream.jar:. Classe.java

Voilà le code d'écriture pour une version récente de la bibliothèque :

FileOutputStream   fos     = null;
XStream            xstream = null;

fos = new FileOutputStream(name);
xstream = new XStream(new StaxDriver());
xstream.toXML(objects, fos);  

Lecture avec un Stream

Si besoin, on peut lire un fichier texte avec un Stream, par exemple :


Stream<String> stream = Files.lines(Paths.get(nomDuFichier));
stream.forEach(System.out::println);

dans un try-with-resources. La classe String peut être par la classe Personne, et le stream transformé en collection grâce à la méthode collect()

Exploitations des données - Streams

Dans la suite de l'exercice, il s'agit de pouvoir afficher la liste des personnes et des langages de manière différente. N'hésitez pas à tester d'abord les exemples du cours sur les streams.

Pour ce faire, on vous propose d'utiliser un Stream et de donner de différentes manières le "comparateur". Pour rappel, voici quelques possibilités vues en cours :


stream.filter(n-> n% 2 ==0);

stream.filter(new Predicate<Integer>)(){
  public boolean test(Integer i) {
     return Integer.valueOf(i) % 2 == 0;
});

La dernière chose que l'on va faire est de calculer l'année moyenne de création d'un langage. Vous pourrez à cet effet utiliser mapToInt() pour transformer le stream objet en IntStream puis appliquer des méthodes comme average(), sum(), count()