Accueil > Java EE > Sortie de Java 8

Sortie de Java 8

Aujourd’hui marque la sortie de la nouvelle version majeure de Java, la tant attendue N°8 !

La sortie était initialement prévue pour Septembre 2013 mais avait été repoussé au premier semestre 2014, principalement pour des corrections de sécurité mais surtout pour finaliser le “projet lambda”.

Java 8, ou plus formellement “JSR-337”, est donc livré aujourd’hui après 2 ans de développement.

Comme la version 5 en son temps, avec les énumérations, les boucles, les generics, etc; cette version va très certainement marquer les esprits des développeurs par les nouveautés apportées au langage.

Petit tour d’horizon des nouveautés majeures :

JSR-335, “Lambda expressions for Java”

La star de cette version, ce sont bien évidemment ces fameuses lambdas expressions. La raison principale du report de la date initiale de release. Elles sont censée rendre à Java ses lettres de noblesses en introduisant des concepts de programmation fonctionnelles et simplifier l’écriture pour les développeurs.

Fini donc les classes anonymes pour définir des callbacks ou bien des fonctions avec Guava, ils seront remplacés par des blocs “() -> {}

Quelques exemples :
new Thread(new Runnable() {
   @Override public void run() {
     System.out.println("Hello");
   }
 }
).start();

Devient :

new Thread( () -> System.out.println("World with Java 8 !") ).start();
Exemple avec l’ajout du support dans l’api Collection :
 List<String> words = Arrays.asList("java", "lambdas", "rocks");
 words.foreach( w -> System.out.println(w));

// ou bien utiliser la référence de la méthode println avec la nouvelle syntaxe “::”
 words.forEach(System.out::println);
Exemple de “map reduce” avec l’api stream :
 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Integer sum = numbers.stream()
 .map((n) -> 2 * n)
 .reduce((total, number)) -> sum + number)
 .get();

En plus de la syntaxe fonctionnelle pour remplace les classes anonymes, les lambdas introduisent aussi la possilibité d’avoir des interfaces avec des implémentations par défaut pour les classes qui les implémentes. Les lecteurs habitués à Scala reconnaîtront les traits. Le nouveau mot-clé pour définir l’implémentation est “default”.

Par exemple, il est désormais possible d’écrire :
public interface ClientTime {

// Méthode à surcharger dans la class fille
 LocalDateTime getLocalDateTime();

// Méthode avec une implémentation par défaut. Implémentation optionnelle dans la classe fille.
 default ZonedDateTime getZonedDateTime(String zoneString) {
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
 }
}

Mais alors, vous me direz, et l’héritage en diamant ? Ce problème bien connus des développeurs C++ qui se produit quand deux classes mère définissent la même méthode, quelle méthode utiliser dans la classe fille ? Et bien le compilateur Java retournera tout simplement une erreur obligeant à préciser quelle méthode utiliser pour la surcharge.

Je vous invite à lire l’excellent post d’Olivier Croisier pour plus de détails sur ce sujet.

JSR-310 – Nouvelle api date & time

Longtemps critiquée pour sa complexité et ses failles, l’api date et heure de Java se voit finalement proposée dans une nouvelle version dans le package : java.time.*

Beaucoup de développeurs utilise d’ailleurs déjà JodaTime à la place de librairie du JDK. Ils ne seront pas dépaysés car elle a fortement inspirée cette JSR.

JEP-104 Annotations on Java Types

Jusque là, il n’était possible d’ajouter des annotations qu’aux “declarations”. (Au sens large, c’est à dire, attributs, méthodes, paramètres). Désormais, il est possible d’ajouter une annotation partout où il est possible de typer une variable.

Cette propriété est en fait particulièrement si elle appliqué avec les annotations définies par la JSR-308 et vérifiées par le checker associé.

On peut par exemple écrire :

 Map<@NonNull Integer, @NonEmpty List<Item>> itemsByInvoiceId;

Pour vérifier que chaque facture de la map est identifiée par un entier non null et possède une liste d’articles non vide.

JEP-120 Repeating Annotations

Il est désormais possible d’ajouter plusieurs annotations d’un même type à une déclaration. Plus besoin de passer par une annotation qui encapsule une liste (Pensez par exemple au @Columns de JPA).

Cf la documentation d’Oracle.

JEP-101 Generalized Target-Type Inference

Une implémentation de l’inférence de type pour les cas simples où le compilateur peut inférer le type d’un generic dans une déclaration.

Par exemple :

 foo(Utility.<Type>bar());

Devient:

 foo(Utility.bar());

Quid du support dans les IDE ?

Java 8 est supporté par IntelliJ et Netbeans depuis quelques temps déjà Out of the box. Du côté d’Eclipse, le support est prévue pour le jour même de la sortie de Java 8 mais via l’ajout d’un plugin.

N’hésitez donc plus à télécharger cette 8ème version de Java pour vous familiariser avec dés aujourd’hui ! (Si ce n’est pas déjà le cas au moment de votre lecture, le binaire final sera disponible d’ici quelques heures).

https://jdk8.java.net/download.html

Sources:

Documentation officielle sur les lambdas : http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

JDK 8: http://openjdk.java.net/projects/jdk8/

Categories: Java EE Tags: , ,
  1. Pas encore de commentaire
  1. Pas encore de trackbacks


+ quatre = 12