les nouveautés de java 7 et les promesses

Post on 22-Jun-2015

960 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Eric TOGUEM

2

LES NOUVEAUTÉS DE JAVA 7

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

}

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

}

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

}

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

}

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}

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)

} }

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

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

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

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

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

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

}

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

} }

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.

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

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

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

}

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

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

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

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

24

AWT/Swing

Nimbus, le nouveau LookAndFeel

25

LES PROMESSES DE JAVA 8

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

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

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

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

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

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

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

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

34

top related