Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Predicate y Consumer

38/39
Recursos

Aportes 21

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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 + 4?Integer 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

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í.

La programación funcional es muy poderosa, se puede llegar a hacer todo en una sola línea.
series.forEach(serie ->
serie.getChapters().stream().filter(Film::getIsViewed).forEach(
chapter -> contentReport.append(chapter.toString()).append("\n")));

Pero a nivel personal, no es bueno abusar de ello, aveces el código se vuelve demasiado tedioso de leer, por ende es bueno separar responsabilidades en la medida de lo posible, además que para realizar pruebas unitarias es mucho más fácil.

😦 deverian actualizar los videos

Muy buena clase, predicate y consumer no lo habia visto hasta este momento.

Muy buena clase, Gracias!

Predicate<Book> bookReaded = b -> b.getIsReaded();
Consumer<Book> bookConsumer = b -contentReport.append(b.toString() + “\n”);

books.stream().filter(bookReaded).forEach(bookConsumer);

Excelente clase.

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:
https://github.com/shiroukamui/JavaSE-Basico

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.

Excelente clase, el código se redujo muchisimo!

Sin duda que programar a este nivel es excelente, solo queda ponerlo en práctica. 😃.

excelente explicación!!!

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.

Muy interesante la posibilidad de reducir tanto código.

Muy buena clase se aprende bastante de los Consumer y las lambdas, excelente explicación

implementación de lambdas al metodo makeReport(Date date)

Genial!! 😃

Listo 😃

Gracias por todo =)

contentReport.append("Date: " + dateString + "\n\n\n");
	     
		
		Consumer<Movie>moviesEach=m->{
			ArrayList<Movie> movies_date=new ArrayList<>();
			movies_date=Movie.makeMovieslistDate(date);
			movies_date.forEach(c->contentReport.append("\n\n"+c));
		};
		
		movies.stream().forEach(moviesEach);
		
		Consumer<Serie>seriesEach= s-> {
			ArrayList<Chapter> chapters = s.getChapters();
			chapters.stream().filter(c->c.getIsViewed()).forEach(c->contentReport.append(c.toString() + "\n"));
		};
		series.stream().forEach(seriesEach);
	
		books.stream().filter(b-> b.getIsReaded()).forEach(b->contentReport.append(b.toString() + "\n"));