Blog

Café para todos

Desde hace unos meses (18 de Marzo de 2014), tenemos una nueva versión de la plataforma estándar de Java, JSE 8.0.

Nada que decir y nada que objetar.

¿Nada? Bueno, resulta que la gente de Sun MicroSystems en su día (Java 5.0)  y los chicos de Oracle en la actualidad están llevando a la práctica la (¿desagradable?, ¿cuestionable?, ¿inevitable?, ¿imprescindible?) costumbre de que las nuevas versiones incorporan novedades que ni siquiera compilan con versiones anteriores, funcionalidades bastante golosas para los desarrolladores, todo hay que decirlo.

Adiós a los “buenos viejos tiempos” de “tú escribe que yo lo compilo sin más”. Bien, podemos vivir con ello, siempre que el premio merezca la pena.

Estamos ante una revisión mayor del lenguaje, que parece iniciar un proceso irreversible de adaptación a los “buenos nuevos tiempos”. Por resumir, programación funcional y concurrencia fácil.

Java nunca ha sido un lenguaje funcional, sino parcialmente orientado a objetos (un 3 no tiene comportamiento asociado, no es un objeto, es, ¡horror de los horrores!, un dato), e imperativo más que declarativo.

Un lenguaje que implementa el paradigma funcional hasta sus últimas consecuencias, como Haskell, no tiene bucles (!) ni variables (!!!). En Haskell, un println se considera código impuro, por el amor de Dios. Cosas como las operaciones de entrada-salida nos avergüenzan, generan contextos mutables; ¡qué repelús!.

Se pretende trabajar tan solo con valores inmutables, mientras que Java hace exactamente lo contrario.

Sin embargo, Java tiene a su favor la portabilidad, una implantación impresionante en la industria, toneladas de software de código abierto para ayudar a hacer prácticamente cualquier cosa y una implementación más que buena de la orientación a objetos clásica.

Aún así, tenemos grandes novedades en Java 8.

Por ejemplo, ahora podemos introducir en interfaces métodos con código:


public interface EstoEsIncreible{

void hazAlgoDeUnaVez( Cosa usaEstoPeroYa);

default void cuéntameComoPasó(Logger log){

log(“Estoy en “ + this.getClass().getName());

}

}

Lo cual puede ser una ayuda considerable en la reutilización sin más de comportamiento común a un conjunto de clases. Nada de implementar N veces métodos como “cuéntameComoPasó”.

Tal vez lo más interesante, por prometedor, es la incursión de Java 8 en la programación funcional y en la concurrencia ad hoc.

Supongamos que tenemos una lista de empleados y queremos calcular la suma del salario bruto de aquéllos que tienen una antigüedad superior a 3 años:


List<Empleado> empleados = obtener de forma automágica todos los empleados...


Integer resultado = empleados.

stream().

filter(e -> e.getAntiguedad() > 3).

mapToInt(e -> e.getSalario()).sum();

Bueno, programación funcional en toda su gloria.Totalmente declarativa, sin decir en ningún momento más que lo queremos hacer, no cómo.

Aquí hay mucho que observar. El método stream() produce una especie de tubería (pipeline) que acumula operaciones sin ejecutarlas, hasta que se ve forzado a ello (método sum() ). Así que en lugar de generarse dos listas intermedias, para filter y mapToInt, no se usa más que una. Esto es también muy común en programación funcional, la llamada evaluación vaga (lazy evaluation).

Sigamos suponiendo. El ordenador que usamos tiene varios núcleos, y sabemos que nuestra operación de calcular el salario bruto podría hacerse en paralelo sin problemas, ganando presumiblemente en eficiencia.

¿Como hacemos?

¿Usamos threads a mano? Ni hablar. Menuda pesadilla.

¿Empleamos un Executor de JSE 1.5? Algo mejor, pero aún así, en cuanto a nivel de abstracción apenas hemos abandonado el suelo.

Java 8 propone la siguiente solución:

Integer resultado = empleados.

stream().parallel().

filter(e -> e.getAntiguedad() > 3).

mapToInt(e -> e.getSalario()).sum();

Mejor, mucho mejor. Basta incluir la llamada al método parallel() para que todas las operaciones se desarrollen en paralelo automáticamente.Ya veis, concurrencia a lo fácil.

Hay un libro gratuito, publicado en la Red, que se ha convertido lector a lector en una especie de leyenda. Por el tema, y sobre todo, por el ingenio y acierto con el que está escrito. Su título, traducido a nuestra lengua, podría ser “Aprenda Haskell por el bien de todos”.

¿Qué os parece? ¿Estamos más cerca con Java 8 de poder decir, con la cabeza muy alta, “Aprenda Java por el bien de todos”?

Saludos y hasta pronto.





Visita nuestro perfil:


Icono Training Consulting