Novedades en Expression Language 3 (EL 3.0)

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 o classname.attribute . Sólo se pueden utilizar directamente las clases bajo java.lang.* teniendo que importar de manera explícita el resto. Para invocar un constructor utilizamos classname([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.