Dans l'arsenal des améliorations incluses dans Java EE 7, il y a une refonte de l'Expression Language Java appelée Expression Language 3. Spécifiée dans la JSR-341, cette collection d'améliorations à l'API EL inclut le support des expressions lambda, l'accès aux champs et méthodes statiques, mais aussi des améliorations pour le traitement des collections et un mode d'utilisation autonome.
Avant Java EE, l'Expression Language Java était un composant fortement couplé aux API JavaServer Faces et JavaServer Pages. La JSR-341 introduit une Expression Language Java en tant qu'entité distincte, découplée (mais néanmoins intéropérable) des API de la couche présentation de Java EE.
L'API offre à présent aux développeurs la possibilité d'invoquer l'EL Java directement. La création d'une instance de la toute nouvelle classe ELProcessor
et l'invocation de sa méthode eval
avec une chaîne de caractères qui représente le script à évaluer retourneront un résultat qui pourra être utilisé dans une variable de l'application Java elle-même.
ELProcessor el = new ELProcessor();
assert ((Integer)el.eval("a = [1, 2, 3]; a[1]")) == 2;
En plus de ce mode autonome, la JSR-341 apporte aux développeurs JavaEE la possibilité d'écrire des expressions lambda. Les expressions lambda sont prévues pour l'édition standard de Java qui arrivera l'année prochaine avec Java 8, mais dès à présent, les développeurs peuvent utiliser les lambdas dans leurs expressions EL. Lors de la conférence JavaOne de l'année dernière, le chef de la spécification JSR-348 Kin-man Chung a précisé que le groupe d'experts avait grandement consulté les développeurs du projet Lambda de Java 8 pour s'assurer que l'API était commune et que l'interopérabilité entre Java EL et Java 8 serait possible.
ELProcessor el = new ELProcessor();
assert ((Integer)(el.eval("((x,y) -> x+y)(4, 5)"))) == 9;
Pour travailler avec les collections, la nouvelle API de flux Java EL inclut des opérateurs tels que forEach
, reduce
, filter
, et map
. La plupart des fonctionnalités et des concepts introduits dans le traitement des collections Java EL seront aussi intégrées dans la version 8 de Java. Dès maintenant, avec cette JSR-341, les développeurs peuvent déjà tirer partie des flux traités à la demande (lazy streams) ou bien immédiatement (eager streams), en s'appuyant sur les expressions Lambda.
ELProcessor el = new ELProcessor();
List list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
el.defineBean("list", list);
List processedList = (List)el.eval("list.stream().filter( x -> x <= 3).map(x -> x * 5).toList()");
assert processedList.get(0) == list.get(0);
assert processedList.get(1) == list.get(5);
assert processedList.get(2) == list.get(10);
assert processedList.get(3) == list.get(15);
Par ailleurs, une amélioration du Java EL très attendue fait partie de cette JSR-341, les développeurs pourront dorénavant accéder directement aux champs et aux méthodes statiques. Toutes les classes du paquetage java.lang.*
sont pré-importées par défaut dans tous les scripts. Quant aux autres classes, les développeurs EL pourront y accéder à condition de les avoir importées dans le contexte EL au moyen de l'ELManager
fourni par l'instance d'ELProcessor
.
ELProcessor el = new ELProcessor();
el.getELManager().importStatic("com.company.Class.STATIC_FIELD");
assert (el.eval("Math.random()") instanceof Double);
System.out.println(el.eval("STATIC_FIELD"));
Ces améliorations de l'Expression Language Java qui constituent la JSR-341 devraient se révéler d'une aide précieuse pour les développements JSP et JSF, mais aussi pour une utilisation dans un mode autonome.