Java, desde su versión 8, introdujo el concepto de Streams, que revolucionó la forma en la que manejamos colecciones de datos. Los Streams son una herramienta poderosa que permite trabajar con colecciones de manera más elegante y eficiente mediante el uso de lambdas. Al envolver una colección con un Stream, se le otorga la capacidad de operar utilizando expresiones lambda, mejorando así la legibilidad y efectividad del código.
¿Cómo se integra Stream con filtros?
La combinación de Streams con filtros facilita la manipulación de colecciones. Primero, se transforma la colección en un Stream utilizando el método stream(). Posteriormente, se aplica el método filter() que, a través de una expresión lambda, filtra los elementos de la colección basándose en una condición. Esta es una alternativa más concisa a la clásica estructura if.
En este ejemplo, se filtran las películas vistas y se añade su título al contentReport usando lambdas.
¿Cómo el uso de múltiples filtros beneficia el código?
En Java, los Streams y los filtros también permiten aplicar múltiples condiciones en secuencia. Cada filter() devuelve un nuevo Stream filtrado, al que se le pueden seguir aplicando más filtros. Esto es útil para refinar pasos y hacer que el código sea más claro y modular.
Stream<String> filteredWords = words.stream().filter(s -> s !=null).filter(s ->!s.isEmpty());
Aquí, primero se eliminan los valores null y luego las cadenas vacías, consiguiendo un Stream purificado con solo palabras significativas.
¿Cómo se aplica ForEach junto a Streams para iterar colecciones?
El método forEach() en Java permite iterar sobre los elementos del Stream después de aplicar los filtros necesarios. Se utiliza principalmente para realizar acciones sobre cada elemento de la colección sin modificar los datos originales.
En este caso, se imprime el título de cada película filtrada, demostrando el poder del forEach() para realizar operaciones directas.
¿Por qué cambiar a inmutabilidad y usar StringBuilder?
Una de las peculiaridades de la programación funcional es la inmutabilidad, que dicta minimizar el uso de variables que cambian de estado. En este contexto es donde StringBuilder resulta útil, permitiendo la manipulación de cadenas sin alterar la referencia original, evitando problemas de mutabilidad.
Aquí, append() se utiliza para construir una cadena de texto que contiene los títulos de las películas vistas, sin afectar la integridad del StringBuilder.
Desde sus bases, Java y sus características avanzadas como Streams, filtros y lambdas, ofrecen herramientas versátiles para mejorar la legibilidad y eficiencia del código. El esfuerzo por adoptar estas prácticas respalda un desarrollo más robusto y moderno. Te animo a seguir explorando y aplicando estos conceptos para cultivar habilidades de programación aún más efectivas.
Streams y Filters en Java para Optimizar Colecciones
La clase StringBuilder crea cadenas que permiten mutación
El encadenado es distinto a String. Con String, el resultado es una nueva cadena. StringBuilder realiza los cambios en la misma cadena, y devuelve una referencia a la misma
El objeto StringBuilder nos ayuda a eso, a construir cadenas de forma optima en java, otros dos métodos bastante útiles que tiene este objeto y que utilizo seguido son:
.chartAt(index)
.reverse()
Para mayor referencia puedes consultar el API
Una sola linia de codigo dice... claro, haciendo uso de las malas practicas de escribir linias demasiado largas. Para mantener una buena legibilidad en el codigo, nunca debería existir el scroll horizontal.
Tecnicamente es una sola linea, solo que como bien dices nunca debería existir el scroll horizonal por eso se suele hacer separarlo por acciones que serían los "."
Hola, claro que se puede. Un ejemplo pueden ser las funciones de orden mayor, que toman el valor de una lambda como parámetro de otra.
Te recomiendo visitar el curso de Programación Funcional con java SE para ver a profundidad estos temas.
Me parece que esta introducción a la programación funcional quedo muy bien explicada, además me parece un paradigma muy bonito, quede entusiasmado por aprender mas de este paradigma
StringBuilder hola = new StringBuilder();
hola.append(“Concatena cadena”);
.append()
Ejemplo:
StringBuilder sb =newStringBuilder();sb.append("Hola");sb.append(" ").append("mundo");sb.append(" ").append(77);System.out.println(sb);//"Hola mundo 77"
Apuntes y ejercicio practico de stream y filter
Limitar la cantidad de elementos de una colección
comparar caracteres
una o varias condicione en un filter
agregar en un variable una condicion de busquedad
imprimir los elementos con equals
hacer filtros en el el forEach
filtrar por el caráctere inicial de un elemento con starsWith(“a”)
~~~publicclassMainBook{publicstaticvoidmain(String[] args){Book book1 =newBook("Avatar",1,"Steven Spilberg",2012);Book book2 =newBook("Troya",3,"Hommer",2014);Book book3 =newBook("Cien años de soledad",2,"Gabriel garcia marquez",2016);Book book4 =newBook("Homonimos",4,"Fitzcher",2021);Book book5 =newBook("Nifelgain",5,"Bohr",2025);Book book6 =newBook("Caras ocultas",6,"Augusto Torres",2027);List<Book> books =newArrayList<>(); books.add(book3); books.add(book2); books.add(book1); books.add(book4); books.add(book6); books.add(book5);for(Book listarLibros : books){System.out.println(listarLibros.getAuthor()+ listarLibros.getName());}System.out.println("Iterar coleccion con forEach"); books.forEach(printBooks ->System.out.println(printBooks));System.out.println("Listar los id de la coleccion"); books.forEach(printBooks ->System.out.println(printBooks.getId()));System.out.println("Listar coleccion con forEach limitando los elementos"); books.stream().limit(2).forEach(System.out:: println);System.out.println("Listar libros inferiores al año 2015"); books.stream().filter(ageMin -> ageMin.getAge()<=2015).forEach(System.out:: println);System.out.println("Listar libros por comparacion de caracteres"); books.stream().filter(charComparate -> charComparate.getName().contains("Homo")).forEach(charComparate ->System.out.println(charComparate));System.out.println("Listar libros por varias condiciones en el mismo filtro"); books.stream().filter(ageMin -> ageMin.getAge()<=2015&& ageMin.getId()<2).forEach(System.out:: println);System.out.println("Agregar el primer criterio de busquedad en un predicado e imprimir en un filtro aparte otro criterio");Predicate<Book> ageMinBooks = ageMin -> ageMin.getAge()<=2015; books.stream().filter(ageMinBooks)//.filter(indice -> indice.getId() < 2)//.filter(name -> name.getName().equals("Troya")).filter(name ->!name.getName().equals("Troya")).forEach(System.out:: println);//System.out.println("Ordenamos la coleccion");//books.stream().filter(idOrder -> idOrder.getId()).sorted().forEach(System.out :: println);System.out.println("Listar tamaño de la coleccion");System.out.println(books.size());System.out.println("Listar el autor del libro por caracter inicial del nombre del libro "); books.stream().filter(chartStarName -> chartStarName .getName().startsWith("C")).forEach(chartStarName ->System.out.println(chartStarName.getAuthor()));//books.stream().sorted().forEach(System.out::println); System.out.println("Imprimir los libros por id > 2 y que tenga el nombre igual a Homonimos");Predicate<Book> filterMayorId = idMayor -> idMayor.getId()>2; books.stream().filter(filterMayorId).filter(name ->!name.getName().equals("Troya")).collect(Collectors.toList()).forEach(System.out:: println);}}publicclassBook{privateString name;private int id;privateString author;private int age;publicBook(String name, int id,String author, int age){this.name= name;this.id= id;this.author= author;this.age= age;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name= name;}public int getId(){return id;}publicvoidsetId(int id){this.id= id;}publicStringgetAuthor(){return author;}publicvoidsetAuthor(String author){this.author= author;}public int getAge(){return age;}publicvoidsetAge(int age){this.age= age;} @OverridepublicStringtoString(){return"Book [name="+ name +", id="+ id +", author="+ author +", age="+ age +"]";}~~~}publicvoidsetAge(int age){this.age= age;} @OverridepublicStringtoString(){return"Book [name="+ name +", id="+ id +", author="+ author +", age="+ age +"]";}~~~