Novedades en Expression Language 3 (EL 3.0)
• jsp, java8, el, expression language, lambda expressions, java7, javaee7, jsf, java
Hace unos días se ha publicado la primera RC de Apache Tomcat 8 que incorpora como principal novedad la alineación con Java EE 7. Eso incluye algunas versiones superiores en las tecnologías web. Una de las novedades más interesantes es la actualización a la versión 3 del EL, el lenguaje de expresiones utilizado tanto con JSP como JSF.
La primera novedad, no funcional, es la especificación en sí. Ahora EL cuenta con una especificación propia y de hecho se ha modificado para poder ser un producto utilizado de manera independiente a cualquier tecnología. El JSR es el 341.
Ahora sí, centrándonos en las novedades efectivas:
- Expresiones lambda. Similares en sintaxis a las que, en principio, se usarán con Java 8 pero son específicas de EL (y no requieren, por tanto, Java 8). Ejemplos:
x->x+1
o(x,y)->x+y
- Llamadas a métodos estáticos, incluyendo constructores de clases. La sintaxis es la que esperamos intuitivamente:
classname.method
oclassname.attribute
. Sólo se pueden utilizar directamente las clases bajojava.lang.*
teniendo que importar de manera explícita el resto. Para invocar un constructor utilizamosclassname([args])
. - Concatenación de Strings con el nuevo operador += (el operador + con Strings intenta, en general, la conversión a un valor numérico, como siempre ha hecho).
- Asignación con el operador = ¡así tal cual! Personalmente no estoy seguro de la conveniencia de este operador.
- Concatenación de expresiones con el operador ; (equivalente a la coma en C).
- Variables propias de EL cuyo uso parece lógico al combinar las nuevas funcionalidades de los operadores de asignación (=) y concatenación de expresiones (;).
Operaciones en colecciones de objetos
Basandose en las nuevas librerias de colecciones que se introducirán en Java 8 los diseñadores de EL 3 han incorporado todo un mecanismo de creación y manipulación de colecciones directamente en EL inspirandose en Java 8 con nombres y funcionalidades lo más parecidas posibles.
Construcción
Siempre se suponen Object, no de ningún tipo concreto inferido)
List: [1, "two", 3.0, [foo, bar]]
Set: {1, 2, 3}
Map: {"one":1, "two":2, "three":3}
Operaciones
Las operaciones se basan en la concatenación de operaciones sobre un Stream. Se obtiene un Stream con el método stream()
de Collection o un array. Y luego podemos aplicar operaciones como filter, reduce, map, flatMap… Es recomendable echar un vistazo a la sección 2.3.3 de la especificación para más detalles.
Finalmente os dejo un artículo en el que se ven algunos ejemplos interesantes de las diferentes novedades introducidas en EL 3.0.