Arrêtez d'écrire des boucles !  Top 10 des meilleures pratiques pour travailler avec des collections en Java 8 - 1 Comme vous le savez, nos habitudes sont une seconde nature. Et une fois que vous vous êtes habitué à l'écriture for (int i = 0; i <......), aucune partie de vous ne veut avoir à réapprendre cette construction (d'autant plus qu'elle est assez simple et compréhensible). Cependant, les boucles sont souvent utilisées à plusieurs reprises pour effectuer les mêmes opérations de base, et la répétition est quelque chose dont nous aimerions beaucoup nous débarrasser. Avec Java 8, Oracle a décidé de nous aider à le faire. Vous trouverez ci-dessous les 10 meilleures méthodes de collecte qui vous feront économiser une tonne de temps et de code.

1. Iterable.forEach(Consumer <? Super T> action)

Le nom parle de lui-même. Il itère sur la collection passée en argument et exécute l'expression lambda d'action pour chacun de ses éléments.

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 (filtre Prédicat<? super E>)

Encore une fois, rien de difficile ici. La méthode itère sur la collection et supprime tous les éléments qui correspondent à 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 une seule ligne, nous supprimons de la liste tous les nombres supérieurs à 5.

3. Map.forEach (action BiConsumer <? super K, ? super V>)

La forEachméthode fonctionne non seulement pour les classes qui implémentent l' Collectioninterface, mais aussi pour Map.

 Map <String, String> books = new HashMap<>();
 books.put("War and Peace", "Leo Tolstoy");
 books.put("Crime and Punishment", "Fyodor Dostoevsky");
 books.put("Thinking in Java", "Bruce Eckel");
 books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
 books.put("The Lord of the Rings", "John Tolkien");
 books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien

4. Map.compute (touche K, BiFunction<? Super K,? Super V,? Étend V> remappingFunction)

Semble un peu plus intimidant, mais en fait simple, comme tous les précédents. Cette méthode définit keyla valeur de ' égale au résultat de l' exécution mappingFunction. Par exemple:

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
 
books.compute("Thinking in Java", (a,b) -> b + ", cool dude");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_______________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel, cool dude
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
L'auteur de "Thinking in Java" est définitivement cool ! :)

5. Map.computeIfAbsent (touche K, fonction <? super K, ? étend V> mappingFunction)

Cette méthode ajoutera un nouvel élément au Map, mais seulement s'il n'a pas déjà un élément avec cette clé. La valeur assignée sera le résultat de l'exécution du mappingFunction. Si un élément avec la clé existe déjà, il ne sera pas écrasé. Il restera simplement tel quel. Revenons à nos livres et essayons une nouvelle méthode :

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.computeIfAbsent("Harry Potter and the Prisoner of Azkaban", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Voici notre mappingFunction:

public static String getHarryPotterAuthor() {
        return "Joanne Rowling";
    }
Et voici le nouveau livre :

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Harry Potter and the Prisoner of Azkaban. Author: Joanne Rowling
Book title: Lord of the Rings. Author: John Tolkien

6. Map.computeIfPresent(touche K, BiFunction<? super K, ? super V, ? étend V> remappingFunction)

Ici on a le même principe que Map.compute(), mais les calculs ne sont effectués que si une rubrique avec keyexiste déjà.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.computeIfPresent("Eugene Onegin", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.computeIfPresent("The Brothers Karamazov", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Le premier appel à la fonction n'a apporté aucune modification, car il n'y a pas de livre intitulé "Eugene Onegin" dans notre fichier Map. Mais lors du deuxième appel, le programme a changé l'auteur du livre "Les frères Karamazov" en Alexandre Pouchkine. Sortir:

_________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
 _________________
Book title: The Brothers Karamazov. Author: Alexander Pushkin
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien

7. Map.getOrDefault (clé d'objet, valeur par défaut V)

Cette méthode renvoie la valeur correspondant à key. Si la clé n'existe pas, elle renvoie la valeur par défaut.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
String igor = books.getOrDefault("The Tale of Igor's Campaign", "Unknown author");
System.out.println(igor);
C'est très pratique :

Unknown author

8. Map.merge(touche K, valeur V, BiFunction<? super V, ? super V, ? étend V> remappingFunction)

Je n'ai même pas pris la peine d'essayer de calculer combien de lignes de code cette méthode vous fera économiser.
  1. Si keyn'existe pas dans votre Map, ou si le valuepour cette clé est null, alors la méthode ajoute la key-valuepaire passée au Map.
  2. Si keyexiste et son value != null, alors la méthode change sa valeur en résultat de l'exécution de remappingFunction.
  3. Si remappingFunctionrenvoie null, alors keyest supprimé de la collection.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.merge("Thinking in Java", "Bruce Eckel", (a, b) -> b + " and some coauthor");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
Sortir:

Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel and some coauthor
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
*désolé Bruce*

9. Map.putIfAbsent (touche K, valeur V)

Auparavant, pour ajouter une paire à un Map, si elle n'y était pas déjà, vous deviez procéder comme suit :

Map <String, String> map = new HashMap<>();
if (map.get("Lord of the Rings") == null)
    map.put("Lord of the Rings", "John Tolkien");
Maintenant, tout est devenu beaucoup plus facile :

Map<String, String> map = new HashMap<>();
map.putIfAbsent("Lord of the Rings", "John Tolkien");

10. Map.replace et Map.replaceAll()

Enfin et surtout.
  1. Map.replace(K key, V newValue)remplace keyla valeur de par newValue, si une telle clé existe. Sinon, rien ne se passe.
  2. Map.replace(K key, V oldValue, V newValue)fait la même chose, mais seulement si la valeur actuelle de keyest égale à oldValue.
  3. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)remplace chacun valuepar le résultat de la fonction.
Par exemple:

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.replace("The Brothers Karamazov", "Bruce Eckel", "John Tolkien");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));

Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
Ça n'a pas marché ! La valeur actuelle de la clé "Les Frères Karamazov" est "Fiodor Dostoïevski", et non "Bruce Eckel", donc rien n'a changé.

Map  books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.replaceAll((a,b) -> getCoolAuthor());
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));

public static String getCoolAuthor() {
        return "Cool author";
     }

Title: The Brothers Karamazov. Author: Cool author
Title: Thinking in Java. Author: Cool author
Title: Crime and Punishment. Author: Cool author
Title: War and Peace. Author: Cool author
Title: Lord of the Rings. Author: Cool author
Nous avons facilement changé les valeurs pour l'ensemble Mapsans aucune construction compliquée ! PS S'habituer à la nouveauté est toujours difficile, mais ces changements sont vraiment bons. En tout cas, certaines parties de mon code ressemblent nettement moins à des spaghettis qu'avant :) Bonne chance dans l'apprentissage !