les nouveautés de java 7 et les promesses

34
Les nouveautés de Java 7 et les promesses de Java 8 Eric TOGUEM

Upload: eric-toguem

Post on 22-Jun-2015

960 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Les nouveautés de java 7  et les promesses

Les nouveautés de Java 7 et les promesses de Java 8

Eric TOGUEM

Page 2: Les nouveautés de java 7  et les promesses

2

LES NOUVEAUTÉS DE JAVA 7

Page 3: Les nouveautés de java 7  et les promesses

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);

}

Page 4: Les nouveautés de java 7  et les promesses

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 7Res r = ... // 1. Création de la ressource try {

// 2. Utilisation de la ressource ...

} finally {

// 3. Fermeture de la ressource r.close();

}

Page 5: Les nouveautés de java 7  et les promesses

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();

}

Page 6: Les nouveautés de java 7  et les promesses

6

JSR 334 - Petites améliorations du langage (le projet "Coin")

Exemple: copie de fichier avec le try with resourcestry (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();

}

Page 7: Les nouveautés de java 7  et les promesses

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}

Page 8: Les nouveautés de java 7  et les promesses

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

} }

◦ Maintenantpublic void method() throws IOException, SQLException {

try { // Remonte uniquement des IOException ou SQLException...

} catch (Exception e) { // traitement throw e; // IOException, SQLException (ou unchecked exception)

} }

Page 9: Les nouveautés de java 7  et les promesses

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() 

Page 10: Les nouveautés de java 7  et les promesses

10

JSR 203 - NIO.2 : accès complet aux systèmes de fichiers

Files : méthodes à tout faireboolean 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);

Page 11: Les nouveautés de java 7  et les promesses

11

JSR 203 - NIO.2 : accès complet aux systèmes de fichiers

Copie et déplacement de fichiersFiles.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 );

Page 12: Les nouveautés de java 7  et les promesses

12

JSR 203 - NIO.2 : accès complet aux systèmes de fichiers

Lecture écriture fichier binairebyte[] byteArray = Files.readAllBytes(path); Files.write(path, byteArray);

Lecture écriture fichier texteList<String> lines = Files.readAllLines(path, charset); Files.write(path, lines, charset);

Page 13: Les nouveautés de java 7  et les promesses

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) ) { ... }

Page 14: Les nouveautés de java 7  et les promesses

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); }

}

Page 15: Les nouveautés de java 7  et les promesses

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);

} }

Page 16: Les nouveautés de java 7  et les promesses

16

JSR 203 - NIO.2 : accès complet aux systèmes de fichiers

FileVisitor : parcours d'une arborescencePath dir = Paths.get(); // current directoryFiles.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.

Page 17: Les nouveautés de java 7  et les promesses

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(DosFileAttributeView.class);

Page 18: Les nouveautés de java 7  et les promesses

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();

Page 19: Les nouveautés de java 7  et les promesses

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; } }

}

Page 20: Les nouveautés de java 7  et les promesses

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().

Page 21: Les nouveautés de java 7  et les promesses

21

AWT/Swing TRANSLUCENT - transparence globale

◦ setOpacity() pour définir le niveau d'opacité globale de la fenêtrefinal 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);

Page 22: Les nouveautés de java 7  et les promesses

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);

Page 23: Les nouveautés de java 7  et les promesses

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,64)); frame.setBackground(Color.BLACK));frame.setVisible(true);

Page 24: Les nouveautés de java 7  et les promesses

24

AWT/Swing

Nimbus, le nouveau LookAndFeel

Page 25: Les nouveautés de java 7  et les promesses

25

LES PROMESSES DE JAVA 8

Page 26: Les nouveautés de java 7  et les promesses

26

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’heureLocalDate date = LocalDate.now(); System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth() );

Page 27: Les nouveautés de java 7  et les promesses

27

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);

Page 28: Les nouveautés de java 7  et les promesses

28

Les expressions LambdaNouvelle 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; }

Page 29: Les nouveautés de java 7  et les promesses

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);

Page 30: Les nouveautés de java 7  et les promesses

30

Les expressions LambdaLes 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);

Page 31: Les nouveautés de java 7  et les promesses

31

Les expressions LambdaLes 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

Page 32: Les nouveautés de java 7  et les promesses

32

Les expressions Lambda: exempleTrier une List

◦ Avant Java 8Collections.sort(list, new Comparator<String>() {     @Override     public int compare(String a, String b) {       return a.compareToIgnoreCase(b);     }   });  

◦ À partir de Java 8Collections.sort(list, (String a, String b) -> a.compareToIgnoreCase(b) ); 

list.sort(String#compareToIgnoreCase);

Page 33: Les nouveautés de java 7  et les promesses

33

Les expressions Lambda: exempleGestion des listeners Swing

◦Avant Java 8button.addActionListener(new ActionListener() {     @Override     public void actionPerformed(ActionEvent e) {       uneMethodAExecuterLorsDuClic(e);     }   }); 

◦À partir de Java 8

button.addActionListener(this#uneMethodAExecuterLorsDuClic);

Page 34: Les nouveautés de java 7  et les promesses

34