Prefacio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Java moderno

A veces cuesta creer que un lenguaje con literalmente 20 años de compatibilidad con versiones anteriores pueda cambiar tan drásticamente. Antes del lanzamiento de Java SE 8 en marzo de 2014,1 con todo su éxito como lenguaje de programación definitivo del lado del servidor, Java había adquirido la reputación de ser "el COBOL del siglo XXI". Era estable, omnipresente y se centraba sólidamente en el rendimiento. Los cambios se producían lentamente, cuando se producían, y las empresas sentían poca urgencia por actualizarse cuando había nuevas versiones disponibles.

Todo eso cambió cuando se lanzó Java SE 8. Java SE 8 incluía el "Proyecto Lambda", la principal innovación que introdujo conceptos de programación funcional en lo que posiblemente era el principal lenguaje orientado a objetos del mundo. Las expresiones lambda, las referencias a métodos y los flujos cambiaron radicalmente los modismos del lenguaje, y los desarrolladores han intentado ponerse al día desde entonces.

La actitud de este libro no es juzgar si los cambios son buenos o malos, o si podrían haberse hecho de otra manera. El objetivo es decir: "esto es lo que tenemos, y así es como puedes utilizarlo para hacer tu trabajo". Por eso este libro está diseñado como un libro de recetas. Se trata de lo que necesitas hacer, y de cómo las nuevas funciones de Java te ayudan a hacerlo.

Dicho esto, el nuevo modelo de programación tiene muchas ventajas, una vez que te acostumbras a ellas. El código funcional tiende a ser más sencillo y fácil tanto de escribir como de entender. El enfoque funcional favorece la inmutabilidad, lo que hace que escribir código concurrente sea más limpio y tenga más probabilidades de éxito. Cuando se creó Java, aún podías confiar en la ley de Moore para duplicar la velocidad de tu procesador aproximadamente cada 18 meses. Hoy en día, las mejoras de rendimiento provienen del hecho de que incluso la mayoría de los teléfonos tienen varios procesadores.

Como Java siempre ha sido sensible a la compatibilidad con versiones anteriores, muchas empresas y desarrolladores han pasado a Java SE 8 sin adoptar los nuevos modismos. Aun así, la plataforma es más potente y merece la pena utilizarla, por no mencionar el hecho de que Oracle declaró formalmente el fin de la vida útil de Java 7 en abril de 2015.

Ha llevado un par de años, pero la mayoría de los desarrolladores Java trabajan ahora con el JDK de Java 8, y ha llegado el momento de profundizar y comprender lo que eso significa y qué consecuencias tiene para tu desarrollo futuro. Este libro está diseñado para facilitar ese proceso.

Quién debería leer este libro

Las recetas de este libro asumen que el lector típico ya se siente cómodo con las versiones de Java anteriores a Java SE 8. No necesitas ser un experto, y se repasan algunos conceptos antiguos, pero el libro no pretende ser una guía para principiantes sobre Java o la programación orientada a objetos. Si ya has utilizado Java en algún proyecto y estás familiarizado con la biblioteca estándar, te irá bien.

Este libro cubre casi todo Java SE 8, e incluye un capítulo centrado en los nuevos cambios que llegarán en Java 9. Si necesitas comprender cómo los nuevos modismos funcionales añadidos al lenguaje cambiarán tu forma de escribir código, este libro es una forma de lograr ese objetivo basada en casos prácticos.

Java es omnipresente en el lado del servidor, con un rico sistema de apoyo de bibliotecas y herramientas de código abierto. Spring Framework e Hibernate son dos de los marcos de código abierto más populares, y ambos requieren Java 8 como mínimo o lo harán muy pronto. Si piensas operar en este ecosistema, este libro es para ti.

Cómo está organizado este libro

Este libro está organizado en recetas, pero es difícil tratar individualmente las recetas que contienen expresiones lambda, referencias a métodos y flujos sin referirse a las demás. De hecho, los seis primeros capítulos tratan conceptos relacionados, aunque no es necesario que los leas en ningún orden concreto.

Los capítulos están organizados del siguiente modo:

  • El capítulo 1, Lo básico, cubre los fundamentos de las expresiones lambda y las referencias a métodos, y sigue con las nuevas características de las interfaces: los métodos por defecto y los métodos estáticos. También define el término "interfaz funcional" y explica cómo es clave para entender las expresiones lambda.

  • El Capítulo 2, El paquete java.util.function, presenta el nuevo paquete java.util.function, que se añadió al lenguaje en Java 8. Las interfaces de ese paquete se dividen en cuatro categorías especiales (consumidores, proveedores, predicados y funciones) que se utilizan en el resto de la biblioteca estándar.

  • El Capítulo 3, Flujos, añade el concepto de flujos, y cómo representan una abstracción que te permite transformar y filtrar datos en lugar de procesarlos iterativamente. Los conceptos de "mapear", "filtrar" y "reducir" se relacionan con los flujos, como se muestra en las recetas de este capítulo. En última instancia, conducen a las ideas de paralelismo y concurrencia tratadas en el Capítulo 9.

  • El Capítulo 4, Comparadores y Recopiladores, trata de la ordenación de datos en flujo, y de convertirlos de nuevo en colecciones. La partición y agrupación también forman parte de este capítulo, que convierte lo que normalmente se consideran operaciones de base de datos en sencillas llamadas a bibliotecas.

  • El Capítulo 5, Problemas con flujos, lambdas y referencias a métodos, es un capítulo misceláneo; la idea es que ahora que sabes cómo utilizar lambdas, referencias a métodos y flujos, puedes buscar formas de combinarlos para resolver problemas interesantes. También se tratan los conceptos de pereza, ejecución diferida y composición de cierres, así como el molesto tema de la gestión de excepciones.

  • El Capítulo 6, El tipo opcional, trata sobre una de las adiciones más controvertidas al lenguaje: el tipo Optional. Las recetas de este capítulo describen cómo se pretende utilizar el nuevo tipo y cómo puedes crear instancias y extraer valores de ellas. Este capítulo también revisa la idea funcional de las operaciones de mapa y mapa plano en Optionals, y en qué se diferencian de las mismas operaciones en flujos.

  • El Capítulo 7, E/S de archivos, pasa al tema práctico de los flujos de entrada/salida (en contraposición a los flujos funcionales), y las adiciones realizadas a la biblioteca estándar para incorporar los nuevos conceptos funcionales al tratar con archivos y directorios.

  • El Capítulo 8, El paquete java.time, muestra los fundamentos de la nueva API Fecha-Hora, y cómo (por fin) sustituyen a las clases heredadas Date y Calendar. La nueva API se basa en la biblioteca Joda-Time, respaldada por muchos años de experiencia y uso por parte de los desarrolladores, y se ha reescrito para formar el paquete java.time. Francamente, si ésta hubiera sido la única incorporación a Java 8, habría merecido la pena la actualización.

  • El Capítulo 9, Paralelismo y concurrencia, aborda una de las promesas implícitas del modelo de flujo: que puedes cambiar un flujo secuencial a uno paralelo con una sola llamada a un método, y aprovechar así todos los procesadores disponibles en tu máquina. La concurrencia es un gran tema, pero este capítulo presenta las adiciones a la biblioteca Java que facilitan la experimentación y evalúan cuándo los costes y beneficios merecen la pena.

  • El capítulo 10, Adiciones a Java 9, cubre muchos de los cambios que se producirán en Java 9, cuyo lanzamiento está previsto para el 21 de septiembre de 2017. Los detalles de Jigsaw pueden llenar un libro entero por sí solos, pero los aspectos básicos están claros y se describen en este capítulo. Otras recetas cubren los métodos privados en las interfaces, los nuevos métodos añadidos a los flujos, colectores y Optional, y cómo crear un flujo de fechas.2

  • El Apéndice A, Genéricos y Java 8, trata sobre las capacidades de los genéricos en Java. Aunque los genéricos como tecnología se añadieron en la versión 1.5, la mayoría de los desarrolladores sólo aprendieron lo mínimo que necesitaban saber para hacerlos funcionar. Un vistazo a los Javadocs de Java 8 y 9 demuestra que esos días han pasado. El objetivo de este apéndice es mostrarte cómo leer e interpretar la API para que entiendas las firmas de métodos, mucho más complejas.

Los capítulos, y de hecho las propias recetas, no tienen que leerse en ningún orden concreto. Se complementan entre sí y cada receta termina con referencias a otras, pero puedes empezar a leer por donde quieras. Las agrupaciones de capítulos se proporcionan como una forma de poner juntas recetas similares, pero se espera que saltes de una a otra para resolver cualquier problema que puedas tener en ese momento.

Convenciones utilizadas en este libro

En este libro se utilizan las siguientes convenciones tipográficas:

Cursiva

Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.

Constant width

Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.

Constant width bold

Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.

Constant width italic

Muestra el texto que debe sustituirse por valores proporcionados por el usuario o por valores determinados por el contexto.

Consejo

Este elemento significa un consejo o sugerencia.

Nota

Este elemento significa una nota general.

Advertencia

Este elemento indica una advertencia o precaución.

Utilizar ejemplos de código

El código fuente del libro se encuentra en tres repositorios de GitHub: uno para las recetas de Java 8 (todo menos el Capítulo 10) en https://github.com/kousen/java_8_recipes, otro para las recetas de Java 9 en https://github.com/kousen/java_9_recipes, y uno especial para el ejemplo más amplio CompletableFuture de la Receta 9.7 en https://github.com/kousen/cfboxscores. Todos están configurados como proyectos Gradle con pruebas y un archivo de compilación.

Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir un CD-ROM de ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requiere permiso.

Agradecemos, pero no exigimos, la atribución. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo "Recetas modernas de Java por Ken Kousen (O'Reilly). Copyright 2017 Ken Kousen, 978-0-491-97317-2".

Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en

Safari O'Reilly

Nota

Safari (antes Safari Books Online) es una plataforma de formación y referencia basada en membresías para empresas, administraciones públicas, educadores y particulares.

Los miembros tienen acceso a miles de libros, vídeos de formación, rutas de aprendizaje, tutoriales interactivos y listas de reproducción de más de 250 editoriales, como O'Reilly Media, Harvard Business Review, Prentice Hall Professional, Addison-Wesley Professional, Microsoft Press, Sams, Que, Peachpit Press, Adobe, Focal Press, Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, Jones & Bartlett y Course Technology, entre otras. Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett y Course Technology, entre otras.

Para más información, visita http://oreilly.com/safari.

Cómo contactar con nosotros

Dirige tus comentarios y preguntas sobre este libro a la editorial:

  • O'Reilly Media, Inc.
  • 1005 Gravenstein Highway Norte
  • Sebastopol, CA 95472
  • 800-998-9938 (en Estados Unidos o Canadá)
  • 707-829-0515 (internacional o local)
  • 707-829-0104 (fax)

Para hacer comentarios o preguntas técnicas sobre este libro, envía un correo electrónico a

Para más información sobre nuestros libros, cursos, conferencias y noticias, consulta nuestro sitio web en http://www.oreilly.com.

Encuéntranos en Facebook: http://facebook.com/oreilly

Síguenos en Twitter: http://twitter.com/oreillymedia

Míranos en YouTube: http://www.youtube.com/oreillymedia

Agradecimientos

Este libro es el resultado inesperado de una conversación que mantuve con Jay Zimmerman a finales de julio de 2015. Yo era (y sigo siendo) miembro de la gira de conferencias No Fluff, Just Stuff, y ese año Venkat Subramaniam impartía varias charlas sobre Java 8. Jay me dijo que Venkat había decidido reducir su actividad el año siguiente y se preguntaba si yo estaría dispuesto a dar charlas similares en la nueva temporada, que empezaba a principios de 2016. Llevo programando en Java desde mediados de los 90 (empecé con Java 1.0.6) y tenía previsto aprender las nuevas API de todos modos, así que acepté.

Llevo un par de años haciendo presentaciones sobre las nuevas características funcionales de Java. En otoño de 2016 había terminado mi último libro,3 y como se trataba de escribir otro libro de recetas para la misma editorial, pensé tontamente que el proyecto sería fácil.

El célebre autor de ciencia ficción Neil Gaiman dijo una vez que, tras terminar American Gods, pensaba que sabía cómo escribir una novela. Su amigo le corrigió, diciendo que ahora sabía cómo escribir esta novela. Ahora entiendo lo que quería decir. La propuesta original para este libro preveía entre 25 y 30 recetas que ocuparían unas 150 páginas. El resultado final que tienes en tus manos tiene más de 70 recetas que llenan casi 300 páginas, pero el mayor alcance y el mayor detalle han producido un libro mucho más valioso de lo que pretendía.

Por supuesto, eso se debe a que he tenido mucha ayuda. El ya mencionado Venkat Subramaniam ha sido de gran ayuda, tanto a través de sus charlas como de sus otros libros y discusiones privadas. También ha tenido la amabilidad de ser revisor técnico de este libro, así que cualquier error que quede es culpa suya. (No, son míos, pero por favor, no le digas que lo he admitido).

También estoy muy agradecido por haber contado con la ayuda frecuente de Tim Yates, que es uno de los mejores programadores que he conocido. Le conocía por su trabajo en la comunidad Groovy, pero su versatilidad va mucho más allá, como demuestra su puntuación en Stack Overflow. Rod Hilton, a quien conocí dando presentaciones de Java 8 en la gira de la NFJS, también tuvo la amabilidad de ofrecer una reseña. Las recomendaciones de ambos han sido inestimables.

He tenido la suerte de trabajar con los excelentes editores y el personal de O'Reilly Media a lo largo de dos libros, más de una docena de cursos de vídeo y muchas clases de formación en línea impartidas en su plataforma en línea Safari. Brian Foster ha sido una fuente constante de apoyo, por no mencionar su capacidad casi mágica para atravesar la burocracia. Le conocí mientras escribía mi libro anterior, y aunque no fue el editor de éste, su ayuda y amistad han sido muy valiosas para mí durante todo el proceso.

Mi editor, Jeff Bleiel, fue muy comprensivo cuando el libro duplicó su longitud, y me proporcionó la estructura y la organización necesarias para seguir avanzando. Estoy muy contenta de que hayamos podido trabajar juntos y espero que sigamos haciéndolo en el futuro.

Tengo que dar las gracias a muchos de mis compañeros ponentes de la gira de la NFJS, como Nate Schutta, Michael Carducci, Matt Stine, Brian Sletten, Mark Richards, Pratik Patel, Neal Ford, Craig Walls, Raju Gandhi, Kirk Knoernschild, Dan "el Hombre" Hinojosa y Janelle Klein, por su perspectiva y ánimo constantes. Tanto escribir libros como impartir clases de formación (mi verdadero trabajo diario) son actividades solitarias. Es estupendo contar con una comunidad de amigos y colegas en los que puedo confiar para obtener perspectivas, consejos y diversas formas de entretenimiento.

Por último, tengo que expresar todo mi amor a mi esposa Ginger y a mi hijo Xander. Sin el apoyo y la amabilidad de mi familia no sería la persona que soy hoy, un hecho que me resulta más evidente cada año que pasa. Nunca podré expresar lo que ambos significáis para mí.

1 Sí, en realidad han pasado más de tres años desde el primer lanzamiento de Java SE 8. Yo tampoco me lo puedo creer.

2 Sí, a mí también me hubiera gustado que el capítulo sobre Java 9 hubiera sido el capítulo 9, pero no me parecía correcto reordenar los capítulos sólo por esa simetría accidental. Esta nota a pie de página tendrá que ser suficiente.

3 Gradle Recipes for Android, también de O'Reilly Media, todo sobre la herramienta de construcción Gradle aplicada a proyectos Android.

Get Recetas Java modernas now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.