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 鈥渕ain鈥 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"));