Les nouveautés de java 7 et les promesses

1,802 views
1,637 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,802
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
48
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Les nouveautés de java 7 et les promesses

  1. 1. Les nouveautés de Java 7 etles promesses de Java 8Eric TOGUEM
  2. 2. LES NOUVEAUTÉS DEJAVA 7 2
  3. 3. JSR 334 - Petites améliorationsdu langage (le projet "Coin") Expression littérale binaire: ◦ 0b11111111, Formatage des expressions numériques ◦ long creditCardNumber = 1111_2222_3333_444L; Switch sur les String ◦ switch(action) { case "save": save(); break; case "update": update(); break; case "delete": delete(); break; default: unknownAction(action); } 3
  4. 4. JSR 334 - Petites améliorationsdu langage (le projet "Coin") Type Inference sur la création dinstance Generics (le losange): ◦ Map<Reference<Object>,Map<String,List<Object>>> map = new HashMap<>(), Gestion automatique des ressources ◦ Modèle avant Java 7 Res r = ... // 1. Création de la ressource try { // 2. Utilisation de la ressource ... } finally { // 3. Fermeture de la ressource r.close(); } 4
  5. 5. JSR 334 - Petites améliorations du langage (le projet "Coin") Exemple: copie de fichier: try { InputStream input = new FileInputStream(in.txt); try { OutputStream output = new FileOutputStream(out.txt); try { byte[] buf = new byte[8192]; int len; while ( (len=input.read(buf)) >=0 ) output.write(buf, 0, len); } finally { output.close(); } } finally { input.close(); } } catch (IOException e) { System.err.println("Une erreur est survenue lors de la copie"); e.printStrackTrace(); } 5
  6. 6. JSR 334 - Petites améliorations du langage (le projet "Coin") Exemple: copie de fichier avec le try with resources try (InputStream input = new FileInputStream(in.txt); OutputStream output = new FileOutputStream(out.txt)) { byte[] buf = new byte[8192]; int len; while ( (len=input.read(buf)) >=0 ) output.write(buf, 0, len); } catch (IOException e) { System.err.println("Une erreur survenue lors de la copie"); e.printStrackTrace(); 6
  7. 7. JSR 334 - Petites améliorations du langage (le projet "Coin") Multicatch : traiter plus dune exception à la fois ◦ Avant Java 7 try { ... } catch(IOException e) { // traitement } catch(SQLException e) { // traitement } ◦ Maintenant try { ... } catch(IOException | SQLException e) { // traitement } 7
  8. 8. JSR 334 - Petites améliorations du langage (le projet "Coin") Amélioration du rethrow ◦ Avant Java 7 public void method() throws Exception { try { // Remonte uniquement des IOException ou SQLException... } catch (Exception e) { // traitement throw e; // throws Exception } } ◦ Maintenant public void method() throws IOException, SQLException { try { // Remonte uniquement des IOException ou SQLException... } catch (Exception e) { // traitement throw e; // IOException, SQLException (ou unchecked exception) } } 8
  9. 9. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers Nouveau package java.nio.file en remplacement de la classe java.io.File java.nio.file.Path remplacera java.io.File // Avec java.io.File File file = new File("file.txt"); // Avec java.nio.file.Path : Path path = FileSystems.getDefault().getPath("file.txt"); Path path = Paths.get("file.txt"); Path path = Paths.get("/chemin/de/base", "sous- répertoire", "encore/plusieurs/répertoires", "file.txt"); Méthodes toPath() et toFile() 9
  10. 10. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers Files : méthodes à tout faire boolean exists = Files.exists(path); boolean isDirectory = Files.isDirectory(path); boolean isExecutable = Files.isExecutable(path); boolean isHidden = Files.isHidden(path); boolean isReadable = Files.isReadable(path); boolean isRegularFile = Files.isRegularFile(path); boolean isWritable = Files.isWritable(path); long size = Files.size(path); FileTime time = Files.getLastModifiedTime(path); Files.delete(path); 10
  11. 11. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers Copie et déplacement de fichiers Files.copy(Paths.get("source.txt"), Paths.get("dest.txt")); Files.copy(Paths.get("source.txt"), Paths.get("dest.txt"), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES ); Files.move(Paths.get("source.txt"), Paths.get("dest.txt")); Files.move(Paths.get("source.txt"), Paths.get("dest.txt"), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.ATOMIC_MOVE ); 11
  12. 12. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers Lecture écriture fichier binaire byte[] byteArray = Files.readAllBytes(path); Files.write(path, byteArray); Lecture écriture fichier texte List<String> lines = Files.readAllLines(path, charset); Files.write(path, lines, charset); 12
  13. 13. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers Ouverture de flux divers // Ouverture en lecture : try ( InputStream input = Files.newInputStream(path) ) { ... } // Ouverture en écriture : try ( OutputStream output = Files.newOutputStream(path) ) { ... } // Ouverture dun Reader en lecture : try ( BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8) ) { ... } // Ouverture dun Writer en écriture : try ( BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8) ) { ... } 13
  14. 14. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers DirectoryStream : lister les éléments dun dossier ◦ Liste des fichiers/répertoires du répertoire courant : try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)){ for (Path path : stream) { System.out.println(path); } } ◦ Utiliser un filtre DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() { @Override public boolean accept(Path entry) throws IOException { return Files.isRegularFile(entry) && Files.size(entry) > 8192L; } }; try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) { for (Path path : stream) { System.out.println(path); } } 14
  15. 15. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers DirectoryStream : lister les éléments dun dossier ◦ Utiliser un filtre Path dir = Paths.get(); // current directory try ( DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.txt")) { for (Path path : stream) { System.out.println(path); } } 15
  16. 16. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers FileVisitor : parcours dune arborescence Path dir = Paths.get(); // current directory Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println(file); return FileVisitResult.CONTINUE; } }); ◦ Linterface FileVisitor dispose de quatre méthodes:  visitFile() exécutée sur chaque fichier trouvé.  visitFileFailed() exécutée lorsquune erreur empêche laccès au fichier.  preVisitDirectory() appelée avant le parcours dun répertoire.  postVisitDirectory() appelée une fois le répertoire parcouru. 16
  17. 17. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers FileAttributeView : accès aux attributs ◦ Accès complet aux attributs via un système de vue  BasicFileAttributeView (basic);  DosFileAttributeView (dos);  PosixFileAttributeView (posix);  FileOwnerAttributeView;  AclFileAttributeView (acl) ; ◦ Vérification du support Files.getFileStore(path).supportsFileAttributeView(D osFileAttributeView.class); 17
  18. 18. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers FileAttributeView : accès aux attributs ◦ Accès en lecture/écriture aux attributs DOS : DosFileAttributeView dosView = Files.getFileAttributeView(path, DosFileAttributeView.class); dosView.setArchive(false); DosFileAttributes attrs = dosView.readAttributes(); boolean a = attrs.isArchive(); 18
  19. 19. JSR 203 - NIO.2 : accès complet aux systèmes de fichiers WatchService : détecter les changements dans un répertoire // On crée un objet WatchService, chargé de surveiller le dossier : try (WatchService watcher = path.getFileSystem().newWatchService()) { // On y enregistre un répertoire, en lui associant certains types dévènements : path.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); // (ou plusieurs) // Puis on boucle pour récupérer tous les événements : while (true) { // On récupère une clef sur un événement (code bloquant) WatchKey watchKey = watcher.take(); // On parcourt tous les évènements associés à cette clef : for (WatchEvent<?> event: watchKey.pollEvents()) { if (event.king()==StandardWatchEventKinds.OVERFLOW) continue; // évènement perdu System.out.println(event.kind() + " - " + event.context()); } // On réinitialise la clef (très important pour recevoir les événements suivants) if ( watchKey.reset() ==false ) { // Le répertoire quon surveille nexiste plus ou nest plus accessible break; } } } 19
  20. 20. AWT/Swing TransferHandler.setDragImage() pour définir une image à afficher pendant le drag&drop. JList<E> et JComboBox<E>. Window.setType() + Window.Type contenant trois valeurs possibles : ◦ NORMAL pour le comportement par défaut, ◦ POPUP pour les fenêtres temporaires, ◦ UTILITY pour les barres doutils ou palettes. BorderFactory senrichit de nouveaux types de bordures: ◦ createDashedBorder(), ◦ createLineBorder(), ◦ createLoweredSoftBevelBorder(), ◦ createRaisedSoftBevelBorder(), ◦ createSoftBevelBorder(), ◦ createStrokeBorder(). 20
  21. 21. AWT/Swing TRANSLUCENT - transparence globale ◦ setOpacity() pour définir le niveau dopacité globale de la fenêtre final JFrame frame = new JFrame(); frame.setUndecorated(true); frame.add(new JLabel("Hello World !")); frame.setOpacity(0.75F); frame.getContentPane().setBackground(Color.BLACK); frame.setVisible(true); 21
  22. 22. AWT/Swing PERPIXEL_TRANSLUCENT - transparence pixel par pixel ◦ Permet de définir le niveau de transparence de chaque pixel de la fenêtre. ◦ Utiliser la méthode setBackground() final JFrame frame = new JFrame(); frame.setUndecorated(true); frame.add(new JLabel("Hello World !")); frame.setBackground(new Color(0F,0F,0F,0.75F)); frame.setVisible(true); 22
  23. 23. AWT/Swing PERPIXEL_TRANSPARENT - forme non rectangulaire ◦ Possible de créer des fenêtres non rectangulaires. ◦ On utilisera pour cela la méthode setShape() avec la forme désirée final JFrame frame = new JFrame(); frame.setUndecorated(true); frame.setShape(new RoundRectangle2D.Double(0,0,frame.getWidth(),frame.getHeight(),64,6 4)); frame.setBackground(Color.BLACK)); frame.setVisible(true); 23
  24. 24. AWT/Swing Nimbus, le nouveau LookAndFeel 24
  25. 25. LES PROMESSES DEJAVA 8 25
  26. 26. Une nouvelle API pour lamanipulation des Date et heures(JSR 310) Obtenir l’heure courrante: ◦ Avec la classe Clock: Clock clock = Clock.systemDefaultZone(); long time = clock.millis(); Obtenir la date et l’heure LocalDate date = LocalDate.now(); System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth() ); 26
  27. 27. Une nouvelle API pour lamanipulation des Date et heures(JSR 310) Effectuer les calculs sur les dates et heures Period p = Period.of(5, HOURS); LocalTime time = LocalTime.now(); LocalTime newTime; newTime = time.plus(5, HOURS); newTime = time.plusHours(5); newTime = time.plus(p); 27
  28. 28. Les expressions Lambda Nouvelle syntaxe permettant d’écrire un « morceau de code ». Se décompose en deux partie séparés par une flèche simple ( -> ), ◦ A gauche on retrouve la liste des paramètres entre parenthèses. ◦ A droite un bloc de code entre accolades. (Type arg1, Type arg2) -> { instruction1; instruction2; return value; } 28
  29. 29. Les expressions Lambda Exemple: l’implémentation d’un Comparator : ◦ Avant Java 8: Comparator<String> ignoreCase = new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); } }; ◦ Avec Java 8 Comparator<String> ignoreCase = (String s1, String s2) -> { return s1.compareToIgnoreCase(s2); }; ◦ Peut être simplifié Comparator<String> ignoreCase = (s1, s2) -> s1.compareToIgnoreCase(s2); 29
  30. 30. Les expressions Lambda Les références de méthode ◦ Permettent de référencer une méthode quelconque ◦ Syntaxe composée de deux parties séparées par le caractères dièse ( # )  La partie de gauche: au nom du type Java dans lequel on va rechercher la méthode.  La partie de droite: nom de la méthode, éventuellement suivi par le type de ses paramètres.  Exemple: Comparator<String> ignoreCase = String#compareToIgnoreCase(String); 30
  31. 31. Les expressions Lambda Les méthodes d’extension virtuelles ◦ Comblent les lacunes des interfaces Java:  Une interface publique d’une API ne peut plus être modifiée sous peine de provoquer des erreurs,  Cas des interfaces Collection, List ou Map ◦ Permettent de faire évoluer lesinterfaces en limitant les incompatibilités. 1. Rajouter des méthodes dans l’interface 2. Indiquer une méthode static représentant l’implémentation par défaut qui sera utilisée 31
  32. 32. Les expressions Lambda:exemple Trier une List ◦ Avant Java 8 Collections.sort(list, new Comparator<String>() { @Override public int compare(String a, String b) { return a.compareToIgnoreCase(b); } }); ◦ À partir de Java 8 Collections.sort(list, (String a, String b) -> a.compareToIgnoreCase(b) ); list.sort(String#compareToIgnoreCase); 32
  33. 33. Les expressions Lambda:exemple Gestion des listeners Swing ◦ Avant Java 8 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { uneMethodAExecuterLorsDuClic(e); } }); ◦ À partir de Java 8 button.addActionListener(this#uneMethodAExecuterL orsDuClic); 33
  34. 34. 34

×