Java 8 est disponible !
mer, 19/03/2014 - 16:58
Oracle a mis à disposition Java 8 ce 18 mars comme prévu. Après moult retards, il n'était plus question d'en différer la sortie, quitte à ce que des problèmes de bugs soient éventuellement rencontrés.
Java 8 peut être qualifié d'évolution majeure de Java parmi les évolutions majeures. Cette mouture marquera sans doute autant l'histoire de ce langage que l'avait fait en son temps Java 5, qui amenait la programmation générique.
Compact Profiles
Si JigSaw, un système permettant que générer et mettre en place des modules a finalement été repoussé à Java 9, Java 8 vient avec les Compact Profiles, qui sont des sous-ensembles prédéfinis de la plate-forme Java SE que les développeurs peuvent utiliser pour le déploiement. Les Compact Profiles permettant d’adapter la taille de l’environnement d’exécution aux besoins réels de l’application et aux capacités des petites machines.
Nashorn
Java 8 c'est encore, parmi toutes les nouveautés détaillées par la note de version, Nashorn, un nouveau moteur JavaScript intégré au JDK, qui peut être invoqué via les API existantes javax.script et qui peut aussi être invoqué avec un nouvel outil en ligne de commande.
De la programmation fonctionnelle avec Java
Mais Java 8 c'est aussi, et sans aucun doute surtout, l'arrivée de la programmation fonctionnelle. Celle-ci devrait révolutionner ou au moins faire évoluer considérablement l'écriture du code.
La principale caractéristique de la programmation fonctionnelle est que les fonctions deviennent des valeurs de premier ordre du langage, c'est-à-dire qu'elle peuvent passées en argument à une fonction ou être des valeurs retournées par une fonction.
Pour arriver à cela en Java (et dit très succinctement) nous avons tout d'abord les interfaces fonctionnelles, qui sont des interfaces contenant une et une seule méthode abstraite. Une interface fonctionnelle peut être générique. En voici une, non générique
interface IntegerMath {
int operation(int a, int b);
}
Puis viennent les fonctions anonymes, ou expressions lambda.
Une expression lambda est une fonction qui a accès à son contexte, (en programmation fonctionne on parle en général de closure) c'est-à-dire qu'elle peut accéder à toutes les variables d'instance de son code appelant.
Ces fonctions anonymes n'ont... pas de nom :-) Disons qu'elle ne sont pas déclarées avec un nom. La syntaxe est la suivante :
(paramètres) -> {code}
et elles peuvent servir (mais ne sont pas limitées à cet usage) pour implémenter la méthode abstraite d'une interface. Pour reprendre notre exemple d'interface ci-dessus, nous pouvons avoir :
IntegerMath addition = (a, b) -> a + b;
Nous pouvons, à partir de cela, écrire une calculatrice très simple, dont le "moteur" traite toutes les applications de calcul de la même manière, le travail réelle étant délégué aux fonctions lambdas. Ce code est tiré d'un tutoriel d'Oracle.
public class Calculator {
interface IntegerMath {
int operation(int a, int b);
}
public int operateBinary(int a, int b, IntegerMath op) {
return op.operation(a, b);
}
public static void main(String... args) {
Calculator myApp = new Calculator();
IntegerMath addition = (a, b) -> a + b;
IntegerMath subtraction = (a, b) -> a - b;
System.out.println("40 + 2 = " +
myApp.operateBinary(40, 2, addition));
System.out.println("20 - 10 = " +
myApp.operateBinary(20, 10, subtraction));
}
}
Pour faire évoluer cette calculatrice, il suffirait d'écrire une nouvelle fonction lambda, le "moteur" central restant le même. Par exemple pour ajouter l'opération de multiplication :
IntegerMath multiplication = (a, b) -> a * b;
qui pourrait être utilisé ainsi :
System.out.println("20 * 10 = " +
myApp.operateBinary(20, 10, multiplication));
Nous vous invitions à découvrir Java 8 plus complètement dans Programmez! n° 172