URL: https://linuxfr.org/news/java-8-et-netbeans-8-sont-disponibles Title: Java 8 et NetBeans 8 sont disponibles Authors: claudex Davy Defaud, barmic, j, BAud, ZeroHeure, palm123, Nÿco, domak et Sébastien Koechlin Date: 2014年03月22日T10:53:17+01:00 License: CC By-SA Tags: Score: 31 Oracle a [annoncé](http://mail.openjdk.java.net/pipermail/announce/2014-March/000166.html) la mise à disposition de la nouvelle version standard de Java, huitième du nom. Deux ans et sept mois après Java 7, la publication de cette nouvelle version a été retardée afin d’améliorer la sécurité. Et pour permettre d’exploiter au mieux ce nouveau JDK, une nouvelle version de l’environnement de développement [[NetBeans]] est également disponible et porte le même numéro. Côté [Eclipse](https://fr.wikipedia.org/wiki/Eclipse_%28projet%29), un [correctif](https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler) est proposé et concernant IntelliJ, Java 8 est pris en charge dans la version 13.1 sortie la semaine dernière. Ces deux sorties marquent la volonté d’Oracle de convaincre les développeurs. ---- [Notes de version : What’s New in JDK 8](http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html) [NetBeans 8](https://netbeans.org/community/releases/80/) [Téléchargement](http://www.oracle.com/technetwork/java/javase/downloads/index.html) [JDK 8 features](http://openjdk.java.net/projects/jdk8/features) [[LinuxFr.org] Naissance d’un géant : Java](http://linuxfr.org/news/naissance-dun-g%C3%A9ant-java) ---- #Nouveautés Java 8 ##Les lambdas C’est une technique pour écrire des fonctions qui ne sont pas nommées et directement définies là où elles sont appelées. Cela permet une écriture plus simple pour les fonctions qui ne sont appelées qu’à un seul endroit du code. L’exemple classique est pour définir une fonction de tri : ```java public class Users { public String username; public int karma; /** * Sort users by karma */ public static void sortUser(Users[] users) { Arrays.sort(users, (Users u1, Users u2) -> { return u1.karma - u2.karma; }); } } ``` Avant l’introduction des lambdas, dans cet exemple, il fallait définir une implémentation pour `Comparator`, ce qui était un peu plus verbeux : ```java public class Users { public String username; public int karma; /** * Sort users by karma */ public static void sortUser(Users[] users) { Arrays.sort(users, new Comparator() { @Override public int compare(Users u1, Users u2) { return u1.karma - u2.karma; } }); } } ``` ### Interfaces fonctionnelles (FunctionalInterface) Pour implémenter les lambdas, le langage s’appuie sur les interfaces fonctionnelles, c’est‐à‐dire des interfaces possédant une seule méthode abstraite. Toutes les interfaces respectant cette condition sont, de fait, des interfaces fonctionnelles. Toutefois, il est possible d’utiliser l’annotation ``@FunctionalInterface`` pour qu’une erreur soit levée si une interface ne respecte plus cette condition. ## API Stream ## L’[interface de programmation](http://fr.wikipedia.org/wiki/Interface_de_programmation) (API) _Stream_ a été ajoutée, permettant de représenter des données sous forme de flux et de les manipuler de manière efficace. Cette API s’appuie largement sur les fonctions lambdas décrites plus haut. Les habitués des tubes (_pipes_) du Shell (il y en a par ici ? :)), des langages fonctionnels et de certains autres comme Perl ne devraient pas être trop dépaysés par cette manière de programmer. Voici un exemple sorti de la [documentation officielle](http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html) : ```java int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); ``` Ici, ``widgets`` est une ``Collection``, mais cette API peut être utilisée avec toute sorte de flux de données, comme des fichiers ou des [_sockets_](http://fr.wikipedia.org/wiki/Berkeley_sockets). Il est aussi possible de créer ses propres types de flux _stream_. Enfin, il est possible de paralléliser les traitements sur ces flux de manière simple (plus simple que gérer des ``Threads``). ##Nashorn, JavaScript dans Java Java inclut désormais un nouveau moteur JavaScript qui remplace le vieillissant Rhino. Il permet donc d’invoquer du code JavaScript directement dans le code Java. Il est évidemment possible d’interagir avec le code Java en appelant du code Java en JavaScript, ou même en étendant des classes Java. Il est aussi possible de l’utiliser directement en ligne de commande comme un script classique et d’éviter d’écrire un _wrapper_ Java. La commande s’appelle `jjs`. ##Implémentation par défaut dans les interfaces (_Defender Methods_) Jusqu’à la version précédente, les interfaces Java ne pouvaient contenir de code, uniquement des déclarations de méthodes. À partir de cette version, les implémentations de méthodes statiques et les implémentations par défaut de méthodes sont possibles. Ces dernières sont des implémentations des méthodes qui seront utilisées si la méthode n’est pas redéfinie dans une autre implémentation qui étend celle‐ci ou une classe qui implémente l’interface sans implémentation pour la méthode. Cela fait resurgir le [problème de l’héritage en diamant](http://fr.wikipedia.org/wiki/Probl%C3%A8me_du_diamant) qui était évité par l’absence d’héritage multiple de classe et que les interfaces permettaient d’éviter par rapport aux classes abstraites. Que faire lorsqu’une méthode est définie dans plusieurs interfaces implémentées dans une classe ? Prenons l’exemple suivant : ```java interface A { void m() default {} } interface B extends A {} interface C extends A {} class D implements B, C {} ``` Ce cas est assez simple, _D_ héritera de l’implémentation dans _A_. Si _B_ ou _C_ implémentent la méthode, ce sera cette implémentation qui sera utilisée (l’implémentation la plus spécifique est utilisée). Si _B_ et _C_ implémentent la méthode, il faudrait spécifier explicitement quelle méthode sera utilisée. ##Méthodes statiques dans les interfaces En plus des méthodes par défaut, il est possible de définir des méthodes statiques dans les interfaces. Il n’y a pas de différence avec les méthodes statiques dans une classe. ## API Date ## Beaucoup de monde attendait une évolution (une révolution ?) de l’[interface de programmation](http://fr.wikipedia.org/wiki/Interface_de_programmation) (API) _Date_ et utilisait _JodaTime_ à la place de l’API standard. Java 8 apporte une nouvelle API pour gérer les dates, qui est divisée en deux parties : - le temps humain, principalement porté par ``LocalDate`` et ``LocalTime`` gère une date prenant en compte le fuseau horaire et possédant distinctement différents champs (pour l’heure, le jour, etc.) ; - le temps machine, qui est un horodatage (_timestamp_) et qui s’appuie sur les classes ``Instant`` et ``Duration``. Grande nouvelle : cette nouvelle API est _thread-safe_ ! Je vous laisse découvrir plus en détail cette API au travers du tutoriel de Yohan Beschi, [_Tutoriel sur les nouveautés du langage 8 : la nouvelle API Date et Time_](http://soat.developpez.com/tutoriels/java/time-date-java8/). ##Disparition du Permgen C’est une évolution spécifique à l’implémentation de référence, mais ça fera plaisir à beaucoup de monde en évitant des erreurs du type `java.lang.OutOfMemoryError: PermGen space`. Le _permgen_ stockait les définitions de classes définies dans le programme en cours, et sa taille pouvait poser un problème pour les grosses applications utilisant beaucoup de classes ou les générant en cours de fonctionnement. C’est donc un point en moins à surveiller pour les mises en production.

AltStyle によって変換されたページ (->オリジナル) /