Facultad de Ingeniería
Ingeniería de Sistemas de Información.
Ingeniería de Software.
PROGRAMACIÓN ORIENTADA A
OBJETOS II
2023-1
Contenido
Introducción
Desarrollo
Conclusiones
Referencias
Agenda
• Introducción
• Clases Genéricas
• Lambdas y Streams
Introducción
Introducción
¿Qué significa reutilizar código?
¿Cómo hemos reutilizado código hasta el momento?
¿Por qué es importante reutilizar código?
¿Qué significa mantenibilidad?
¿En qué consiste la escalabilidad?
Logro de Aprendizaje
Conoce las clases genéricas, funciones lambdas y
streams orientando su aplicación a la
reutilización y mantenibilidad de código.
Desarrollo
Introducción
Necesidad de reutilizar código
• La reutilización de código es una práctica fundamental en
la programación orientada a objetos (POO), y se refiere a
la capacidad de utilizar código ya existente en nuevos
proyectos o partes de un proyecto en lugar de tener que
escribir nuevo código desde cero.
Razones para reutilizar código
• Ahorro de tiempo y recursos
• Mejora de la calidad del software
• Facilita el mantenimiento del software
• Fomenta la modularidad del software
Clases genéricas
• En Programación Orientada a Objetos es posible crear
clases que administren distintos tipos de datos.
• Estas clases son muy comunes en la gestión de
colecciones de datos como pilas, colas, listas, árboles,
etc.
Clases genéricas y reutilización
• Las clases genéricas nos evitan duplicar clases que
administran tipos de datos distintos pero implementan
algoritmos (métodos, acciones) similares.
• Por ello, son una herramienta fundamental para reutilizar
código.
Implementación de clases genéricas
• Una clase genérica es una clase que se define con un
parámetro de tipo (o varios), que permite especificar el
tipo de dato que se utilizará en su lugar.
Implementación de clases genéricas
• En Java, este parámetro de tipo se especifica entre
corchetes angulares "<>" justo después del nombre de la
clase.
Implementación de clases genéricas
• Por ejemplo, una clase genérica que implementa una lista
de elementos podría tener la siguiente definición:
Implementación de clases genéricas
• En el ejemplo anterior, la clase "Lista" tiene un parámetro
de tipo "T" que se utiliza para especificar el tipo de datos
que se almacenarán en la lista.
• En el constructor, se crea un arreglo de objetos y este
arreglo es convertido a un arreglo de tipo "T" mediante una
conversión de tipo.
• La lista también proporciona métodos para agregar
elementos y obtenerlos por índice.
Implementación de clases genéricas
• Para utilizar la clase genérica, se especifica el tipo de
datos que se utilizará en lugar del parámetro de tipo al
instanciar la clase.
• Por ejemplo:
Implementación de clases genéricas
• En este ejemplo, se crea una instancia de la clase "Lista"
para almacenar cadenas de caracteres.
• Se agregan dos cadenas y se obtiene la primera cadena
agregada. Como se especificó que la lista es de cadenas
de caracteres, se pueden agregar y obtener cadenas de la
lista.
Uso de clases genéricas
• De forma similar, podríamos utilizar otra instancia de la
clase “Lista” para almacenar otros tipos de datos (enteros,
float u objetos personalizados) siguiendo la lógica
implementada en la clase Lista.
Clases genéricas - Formalización
• La teoría detrás de las clases genéricas en Java se basa
en el concepto de programación genérica, que se refiere a
la capacidad de escribir código que puede manejar
diferentes tipos de datos sin tener que reescribir el código
para cada tipo de dato.
• Las clases genéricas en Java permiten definir clases que
pueden trabajar con diferentes tipos de datos de manera
flexible y segura.
Lambdas & Streams
• Las lambdas y los streams son características
importantes de Java que se introdujeron en Java 8.
• Ambas características están diseñadas para simplificar y
mejorar la escritura de código en Java.
Funciones lambdas
• Las lambdas son funciones anónimas que se pueden
utilizar para implementar interfaces funcionales.
• Las interfaces funcionales son aquellas que tienen un
único método abstracto y se utilizan para representar un
comportamiento específico, como un comparador o un
predicado.
• Las lambdas permiten escribir el código de forma más
concisa y legible, ya que se pueden crear funciones sin
tener que definir una clase separada para cada una.
Funciones lambdas - Ejemplos
• En general, una función lambda en Java tiene la siguiente
sintaxis:
• donde "parametros" son los argumentos de la función,
separados por comas si hay más de uno, y "expresion" es
la expresión que se evalúa para producir el resultado de la
función. Si la función no tiene argumentos, se especifica
como "()".
Funciones lambdas - Ejemplos
• Una función lambda que suma dos números enteros:
• Una función lambda que comprueba si una cadena de
caracteres está vacía:
Funciones lambdas - Ejemplos
• Una función lambda que devuelve el cuadrado de un
número:
• Una función lambda que comprueba si un número es par:
Funciones lambdas - Ejemplos
• Por ejemplo, una lambda que implementa una interfaz
funcional de comparador se puede definir de la siguiente
manera:
• En este ejemplo, la lambda compara dos cadenas de
caracteres utilizando el método "compareTo" de la clase
String.
Funciones lambdas - Ejemplos
• Una función lambda que ordena una lista de objetos por
su atributo "nombre" en orden alfabético:
Streams
• Los streams son una secuencia de elementos que se
pueden procesar de forma eficiente y funcional.
• Se utilizan para realizar operaciones de filtrado, mapeo,
clasificación y reducción en una colección de datos.
• Los streams permiten escribir código más legible y
mantenible, ya que las operaciones se pueden encadenar
en una única línea de código.
Streams
• Por ejemplo, un stream que filtra una lista de números y
los suma se puede definir de la siguiente manera:
• En este ejemplo, el stream filtra los números pares de la
lista, los convierte en valores enteros y los suma.
Consultas
Conclusiones
Conclusiones
• Las clases genéricas en Java proporcionan una forma
poderosa y flexible de crear código reutilizable que puede
trabajar con diferentes tipos de datos.
• Además, el uso de clases genéricas ayuda a garantizar la
seguridad del tipo de datos, ya que los errores de tipo se
detectan en tiempo de compilación en lugar de en tiempo
de ejecución.
Conclusiones
• Las lambdas y los streams son características
importantes de Java que permiten escribir código más
conciso, legible y eficiente.
• Las lambdas permiten escribir funciones anónimas para
implementar interfaces funcionales de manera rápida y
sencilla.
• Los streams permiten procesar colecciones de datos de
forma funcional y eficiente.
GRACIAS
Referencias
• Belmonte et. al (2012). Desarrollo de proyectos Informáticos con Tecnología
Java. JavaHispano.