Les nouveautés de Java 7 et
les promesses de Java 8
Eric TOGUEM
LES NOUVEAUTÉS DE
JAVA 7




                    2
JSR 334 - Petites améliorations
du 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
JSR 334 - Petites améliorations
du langage (le projet "Coin")
   Type Inference sur la création d'instance
    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
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
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
JSR 334 - Petites améliorations
    du langage (le projet "Coin")
   Multicatch : traiter plus d'une exception à la
    fois
    ◦ Avant Java 7
       try { ... }
       catch(IOException e) { // traitement }
       catch(SQLException e) { // traitement }
    ◦ Maintenant
       try { ... }
       catch(IOException | SQLException e) {
                // traitement
       }                                         7
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
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
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
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
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
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 d'un Reader en lecture :
        try ( BufferedReader reader = Files.newBufferedReader(path,
                         StandardCharsets.UTF_8) ) { ... }
        // Ouverture d'un Writer en écriture :
        try ( BufferedWriter writer = Files.newBufferedWriter(path,
                         StandardCharsets.UTF_8) ) { ... }




                                                                   13
JSR 203 - NIO.2 : accès complet
    aux systèmes de fichiers
   DirectoryStream : lister les éléments d'un 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
JSR 203 - NIO.2 : accès complet
    aux systèmes de fichiers
   DirectoryStream : lister les éléments d'un 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
JSR 203 - NIO.2 : accès complet
    aux systèmes de fichiers
   FileVisitor : parcours d'une 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;
                }
         });
    ◦ L'interface FileVisitor dispose de quatre méthodes:
       visitFile() exécutée sur chaque fichier trouvé.
       visitFileFailed() exécutée lorsqu'une erreur empêche l'accès au
        fichier.
       preVisitDirectory() appelée avant le parcours d'un répertoire.
       postVisitDirectory() appelée une fois le répertoire parcouru.
                                                                     16
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
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
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 qu'on surveille n'existe plus ou n'est plus accessible break;
                           }
           }
       }


                                                                                                                             19
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 d'outils ou palettes.
   BorderFactory s'enrichit de nouveaux types de bordures:
    ◦   createDashedBorder(),
    ◦   createLineBorder(),
    ◦   createLoweredSoftBevelBorder(),
    ◦   createRaisedSoftBevelBorder(),
    ◦   createSoftBevelBorder(),
    ◦   createStrokeBorder().


                                                              20
AWT/Swing
   TRANSLUCENT - transparence globale
    ◦ setOpacity() pour définir le niveau d'opacité 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
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
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
AWT/Swing
   Nimbus, le nouveau LookAndFeel




                                     24
LES PROMESSES DE
JAVA 8




                   25
Une nouvelle API pour la
manipulation 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
Une nouvelle API pour la
manipulation 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
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
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
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
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
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
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

Les nouveautés de java 7 et les promesses

  • 1.
    Les nouveautés deJava 7 et les promesses de Java 8 Eric TOGUEM
  • 2.
  • 3.
    JSR 334 -Petites améliorations du 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.
    JSR 334 -Petites améliorations du langage (le projet "Coin")  Type Inference sur la création d'instance 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.
    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.
    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.
    JSR 334 -Petites améliorations du langage (le projet "Coin")  Multicatch : traiter plus d'une exception à la fois ◦ Avant Java 7 try { ... } catch(IOException e) { // traitement } catch(SQLException e) { // traitement } ◦ Maintenant try { ... } catch(IOException | SQLException e) { // traitement } 7
  • 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.
    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.
    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.
    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.
    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.
    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 d'un Reader en lecture : try ( BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8) ) { ... } // Ouverture d'un Writer en écriture : try ( BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8) ) { ... } 13
  • 14.
    JSR 203 -NIO.2 : accès complet aux systèmes de fichiers  DirectoryStream : lister les éléments d'un 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.
    JSR 203 -NIO.2 : accès complet aux systèmes de fichiers  DirectoryStream : lister les éléments d'un 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.
    JSR 203 -NIO.2 : accès complet aux systèmes de fichiers  FileVisitor : parcours d'une 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; } }); ◦ L'interface FileVisitor dispose de quatre méthodes:  visitFile() exécutée sur chaque fichier trouvé.  visitFileFailed() exécutée lorsqu'une erreur empêche l'accès au fichier.  preVisitDirectory() appelée avant le parcours d'un répertoire.  postVisitDirectory() appelée une fois le répertoire parcouru. 16
  • 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.
    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.
    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 qu'on surveille n'existe plus ou n'est plus accessible break; } } } 19
  • 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 d'outils ou palettes.  BorderFactory s'enrichit de nouveaux types de bordures: ◦ createDashedBorder(), ◦ createLineBorder(), ◦ createLoweredSoftBevelBorder(), ◦ createRaisedSoftBevelBorder(), ◦ createSoftBevelBorder(), ◦ createStrokeBorder(). 20
  • 21.
    AWT/Swing  TRANSLUCENT - transparence globale ◦ setOpacity() pour définir le niveau d'opacité 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.
    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.
    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.
    AWT/Swing  Nimbus, le nouveau LookAndFeel 24
  • 25.
  • 26.
    Une nouvelle APIpour la manipulation 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.
    Une nouvelle APIpour la manipulation 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.
    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.
    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.
    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.
    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.
    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.
    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.