Gonzalo Muñoz
César Espitia
Muy buen aporte, muchas gracias!!!
Braian Peña
Gracias por el aporte.
¿Qué es Stream y Filter en programación funcional?
En nuestra exploración anterior, abordamos los conceptos de Stream y Filter fundamentales para la programación funcional. Ahora, vamos a profundizar en cómo trabajar con ellos para manejar listas complejas, como las listas de series de televisión que contienen capítulos múltiples.
¿Cómo aplicar Predicados en Filter?
Vamos a traer a colación los predicados, que son condiciones almacenadas en variables que permiten filtrar elementos dentro de un Stream de manera eficiente y legible.
Uso de predicados
Un predicado es una función lambda que retorna un booleano. Puedes aplicar predicados personalizados para filtrar elementos de manera más sofisticada. Aquí te mostramos cómo se puede lograr:
Predicate<Serie> seriesVistas = serie -> serie.getIsViewed();
Ventajas de los predicados
¿Cómo iterar utilizando Consumers?
Iterar sobre colecciones con la interfaz Consumer te permite aplicar operaciones a cada elemento. Esto es particularmente útil cuando deseas ejecutar varias acciones dentro de un mismo ciclo.
Implementación de Consumers
Con la ayuda de la interfaz Consumer, organizamos el código de forma más clara:
Consumer<Serie> serieEach = serie -> { List<Chapter> chapters = serie.getChapters(); chapters.stream() .filter(chapter -> chapter.isViewed()) .forEach(chapter -> System.out.println(chapter)); };
Beneficios de Consumers
¿Cómo optimizar código con lambdas?
El poder de las expresiones lambda en Java no solo reside en su sintaxis concisa, sino también en su capacidad para transformar y simplificar el código, aumentando su eficiencia y legibilidad.
Ejemplo de optimización
Aplicando lambda y conceptos como Stream y Consumers, podemos transformar un bloque de código extenso y complicado en algo mucho más manejable:
series.stream() .forEach(serieEach);
Ventajas de usar Lambdas
Reto adicional: Implementación en books
El ejercicio actual se ha centrado principalmente en "series", pero el mismo enfoque puede ser aplicado a "books". El desafío consiste en replicar la lógica optimizada usando lambdas para los libros, garantizando una funcionalidad similar.
Pasos para el reto
Con este conocimiento, puedes mejorar la eficiencia de tus proyectos de programación, empleando construcciones solidas y robustas de la programación funcional. La práctica y exploración continua de estas técnicas te permitirá expandir tus habilidades y abrir nuevas oportunidades en tu carrera. ¡Adelante, sigue explorando y aprendiendo!
Gonzalo Muñoz
César Espitia
Muy buen aporte, muchas gracias!!!
Braian Peña
Gracias por el aporte.
Acá dejo mi version del método makeReport() con fecha:
private static void makeReport(Date date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MMM-yyyy-H-m-s"); String dateFormat = simpleDateFormat.format(date); System.out.println("\n:: REPORT DATED " + date + " ::\n"); Report report = new Report("Report-" + dateFormat + ".txt", ":: ALREADY SEEN ::\n"); StringBuilder content = new StringBuilder(); movies.stream() .filter(movie -> movie.getViewed().equals("Yes")) .forEach(movie -> content.append(movie.toString()).append("\n")); series.stream() .filter(serie -> serie.getViewed().equals("Yes")) .forEach(serie -> content.append(serie.toString()).append("\n")); Consumer<Serie> chaptersViewed = serie -> { List<Chapter> chapters = serie.getChapters(); chapters.stream() .filter(chapter -> chapter.getViewed().equals("Yes")) .forEach(chapter-> content.append(chapter.toString()).append("\n")); }; series.stream().forEach(chaptersViewed); books.stream() .filter(book -> book.isReaded().equals("Yes")) .forEach(book -> content.append(book.toString()).append("\n")); magazines.stream() .filter(magazine -> magazine.isReaded().equals("Yes")) .forEach(magazine -> content.append(magazine.toString()).append("\n")); report.setContent(content.toString()); try { report.makeReport(); } catch (IOException e) { e.printStackTrace(); } }
Puede ser ligeramente distinto debido a que a lo largo del proyecto maneje detalles que yo consideré más adecuados que los del ejemplo de Ann, pero igual (para gustos los colores), agredezco enormemente a Ann por este excelente curso aprendí bastante de ella y de los compañeros que aportaron cositas interesantes. Por acá dejo mi repo para el que lo quiera revisar también:
Fernando Rocha Olivera
Lo peor de todo esto es que al hacer programación funcional y utilizar lambda el código se vuelve muy resumido en la misma cantidad de lineas que al hacer un for o foreach normal. la claridad de código esta definida como una buena práctica de programación. y eso no pasa aquí.
Edwin Donato Dominguez Oliva
Muy buena clase, predicate y consumer no lo habia visto hasta este momento.
miguel cossio quispe
:( deverian actualizar los videos
Iliana Deetz
Predicate<Book> bookReaded = b -> b.getIsReaded();
Consumer<Book> bookConsumer = b -contentReport.append(b.toString() + “\n”);
books.stream().filter(bookReaded).forEach(bookConsumer);
Jorge Trujillo
Buen aporte!! (Una pequeña observación omitiste el > en el Consumer).
Edgar Tasayco
Sin duda que programar a este nivel es excelente, solo queda ponerlo en práctica. 😃.
Oscar Estuardo de la Mora
Ademas de poderse usar el StreamBuilder en Lambdas, al concatenar con el método append, es cientos de veces mas rápido que el operador suma entre cadenas.
Freddy Alejandro Leal Gonzalez
Muy buena clase, Gracias!
Noe de Jesus Muñoz Martinez
Excelente clase.
Daniel Yepes
alguien sabe donde puedo ver el curso anterior?
Jorge Paiva
En javascript a una variable se le puede asingar una lambda en el momento de la declaración. En Java por lo visto requiere del tipo Predicate.
Es la regla?
Jorge Paiva
holas, algun enlace donde se liste todos los métodos (foreach, filter, etc) + ejemplos para lambas?
Vespaciano Forero Sanchez
Me crea el reporte .txt pero vacío ?
Vespaciano Forero Sanchez
Tengo la clase makeReport() igual a la de la profesora, me genera en reporte pero vacío?
Antonio Madrid
Está muy bien aprender nuevas formas de programar, aunque se me hace bastante más legible el paradigma imperativo.
Ann Code
ProfesorEs cuestión de que te acostumbres.
Cuando lo haces te gusta más declarativo.
Agustin David Luzenti
Te puedo asegurar que la mayoria de los equipos, con más razón si son proyectos grandes o donde haya una rotacion o inlcusion al equipo de equipo media/alta.
Yossijaki Jorge Astilleros Chávez
Excelente clase, el código se redujo muchisimo!
Norman Erick Estrada Vargas
excelente explicación!!!
Alejandro De Moraiz
A alguno tambien le tiro estos errores al ejecutar el reporte? Exception in thread "main" java.lang.NullPointerException at com.anncode.amazonviewer.Main.makeReport(Main.java:310) at com.anncode.amazonviewer.Main.showMenu(Main.java:84) at com.anncode.amazonviewer.Main.showSeries(Main.java:167) at com.anncode.amazonviewer.Main.showMenu(Main.java:75) at com.anncode.amazonviewer.Main.main(Main.java:39) necesito ayuda, el codigo de los reportes con lambdas esta exactamente igual y no me tira ningun error.
César Espitia
Hola miguelalejandrodemoraiz, la excepción NullPointerException se produce cuando una aplicación intenta utilizar una referencia de objeto que tiene el valor nulo. Estos incluyen: Llamar a un método de instancia en el objeto referido por una referencia nula.
Por favor compartenos tu código para poder ayudarte a determinar exactamente a que se debe el problema.
Jair Israel Avilés Eusebio
Una posible causa es de que tu servicio de base de datos no esta corriendo y al momento de intentar conectar a la base de datos, la conexion falla y regresa un nulo.
Existen 4 tipos de expresiones Lambda:
Funciones (Function): Recibe como argumento dos parámetros de los cuales el primero <T> corresponde al tipo (objeto) de entrada y el segundo <R> como el tipo de salida de aquella operación. Ejemplo:
Function<String, Integer> function = s -> s.length() + s.indexOf(" "); // 10 + 4Integer result = function.apply("Hola mundo"); // Tiene 10 caracteres y el " " se ubica // en la posición 4.
Consumidores (Consumer): Un consumidor es aquella expresión que recibe un parámetro de entrada <T> pero que no retorna o genera ningún valor de salida. Son funciones terminales. Ejemplo:
Consumer<String> consumer = s -> System.out.println(s.toLowerCase()); consumer.accept("Hola Mundo");
Proveedores (Supplier): Un proveedor es una expresión que no recibe parámetros de entrada pero que retornan o generan un tipo de salida <T>
Supplier<String> supplier = () -> "Hola mundo"; supplier.get(); Salida: "Hola mundo"
Predicados (Predicate): Los predicados son expresiones que aceptan expresiones booleanas, es decir, condiciones lógicas.
Predicate<String> predicate = (str) -> str.length() > 6; predicate.test("Hola mundo"); Salida: true