JavaRush /Blog Java /Random-ES /¡Deja de escribir ciclos! Los 10 mejores métodos para tra...

¡Deja de escribir ciclos! Los 10 mejores métodos para trabajar con colecciones de Java 8

Publicado en el grupo Random-ES
Creo que no es necesario explicar a los estudiantes de JavaRush qué son las colecciones y para qué sirven. Sin embargo, después del lanzamiento de la octava versión, muchas operaciones elementales, que antes requerían entre 6 y 7 líneas de código, se simplificaron al mínimo. Sin más preámbulos, aquí están las 10 mejores técnicas del marco de colecciones Java8 que le ahorrarán toneladas de tiempo y espacio. ¡Deja de escribir ciclos!  Los 10 mejores métodos para trabajar con colecciones de Java 8 - 1¡Hola a todos, amigos! El hábito, como sabes, es una segunda naturaleza. Y habiéndome acostumbrado a escribir, for (int i = 0; i <......)no quiero volver a aprenderlo (especialmente porque este diseño es bastante simple y comprensible). Sin embargo, dentro de los bucles a menudo repetimos las mismas operaciones elementales, cuya repetición realmente nos gustaría eliminar. Con el lanzamiento de Java8, Oracle decidió ayudarnos con esto. A continuación se muestran los 10 mejores métodos de recopilación que le ahorrarán mucho tiempo y código.

1. Iterable.forEach (acción del consumidor <? super T>)

El nombre habla por sí solo. Itera a través de la colección pasada y ejecuta una expresión lambda actionpara cada elemento.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7

2. Collection.removeIf(Predicado<? super E> filtro)

Nada complicado tampoco. El método recorre en iteración la colección y elimina los elementos que coinciden filter.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
 numbers.forEach(s -> System.out.print(s + " "));
En una línea eliminamos de la lista todos los números mayores que 5.

3. Map.forEach(BiConsumer<? super K, ? super V> acción)

El método forEachfunciona no sólo para clases que implementan la interfaz Collection, sino también para Map.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин

4. Map.compute(tecla K,BiFunction<? super K, ? super V, ? extiende V> función de reasignación)

Parece un poco más intimidante, pero en realidad es sencillo, como todos los anteriores. Para la clave especificada key, este método establece el valor del resultado de la función remappingFunction. Por ejemplo:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
¡ El autor de " Java Philosophy " es definitivamente genial! :)

5. Map.computeIfAbsent (tecla K, función <? super K,? extiende V> función de mapeo)

El método agregará un nuevo elemento al Mapa , pero solo si el elemento con la misma clave no está allí. valueSe le asignará el resultado de la ejecución de la función mappingFunction. Si ya existe un elemento con dicha clave, no se sobrescribirá, sino que permanecerá en su lugar. Volvamos a nuestros libros y probemos un nuevo método:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Nuestra función mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
Y aquí está el nuevo libro:
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Autor: Джоан Роулинг
Название книги: Властелин Колец. Autor: Джон Толкин

6. Map.computeIfPresent (tecla K, BiFunction<? super K,? super V,? extiende V> remappingFunction)

El mismo principio que , Map.compute()pero todos los cálculos solo se realizarán si el elemento con la clave keyya existe.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Cuando se llamó a la función por primera vez, no se produjeron cambios, porque Mapen el nuestro no existe ningún libro con el título "Eugene Onegin". Pero por segunda vez el programa cambió el autor del libro "Los hermanos Karamazov" por "Alexander Pushkin". Conclusión:
_________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_________________
Название книги: Братья Карамазовы. Autor: Александр Пушкин
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин

7. Map.getOrDefault (Clave de objeto, V valor predeterminado)

Devuelve el valor correspondiente a la clave key. Si dicha clave no existe, devuelve el valor predeterminado.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
Muy cómodamente:
Неизвестный автор

8. Map.merge(tecla K, valor V, BiFunction<? super V, ? super V, ? extiende V> remappingFunction)

Ni siquiera intenté calcular cuántas líneas de código te ahorrará este método.
  • MapSi la clave keyno existe en la tuya , o valuepara esta clave es igual , nullel método agrega .Mapkey-value
  • Si la clave Keyexiste y está ahí, value != nullel método la cambia valueal resultado de ejecutar la función pasada remappingFunction.
  • Si remappingFunctiondevuelve null, keyse elimina de la colección.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.merge("Философия Java", "Брюс Эккель", (a, b) -> b +  " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
Conclusión:
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
*lo siento Bruce*

9. Map.putIfAbsent (tecla K, valor V)

Anteriormente, para agregar un par Mapsi no estaba, había que hacer lo siguiente:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
Ahora todo se ha vuelto mucho más sencillo:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace y Map.replaceAll()

El último de la lista, pero no menos importante. Map.replace(K key, V newValue— reemplaza el valor de la clave keycon newValue, si dicha clave existe. Si no, no pasa nada. Map.replace(K key, V oldValue, V newValue)- hace lo mismo, pero sólo si el valor actual keyes oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— reemplaza todos los valores valuecon el resultado de la ejecución de la función function. Por ejemplo:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
¡No funcionó! El valor actual de la clave de los Hermanos Karamazov es Fyodor Dostoevsky, no Bruce Eckel, por lo que nada ha cambiado.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Autor: Крутой писатель
Название:Философия Java. Autor: Крутой писатель
Название:Преступление и наказание. Autor: Крутой писатель
Название:Война и мир. Autor: Крутой писатель
Название:Властелин Колец. Autor: Крутой писатель
¡Cambió fácilmente los valores de todo el mapa sin construcciones complejas! PD Siempre es difícil acostumbrarse a algo nuevo, pero estos cambios son realmente buenos. En cualquier caso, algunas partes de mi código ahora son definitivamente menos espaguetis que antes :) Si te gustó el artículo y te gustaría ver otros nuevos, no olvides apoyar al autor en el concurso haciendo clic en "Me gusta" o mejor aún, “Me gusta” :) ¡Buena suerte con tus estudios!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION