No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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

39/40
Recursos

Aportes 21

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

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

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.

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

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

😦 deverian actualizar los videos

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

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

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

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.

Muy buena clase, Gracias!

Excelente clase.

Excelente clase, el código se redujo muchisimo!

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"));