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>)
LaforEach
méthode fonctionne non seulement pour les classes qui implémentent l' Collection
interface, 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éfinitkey
la 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 auMap
, 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 queMap.compute()
, mais les calculs ne sont effectués que si une rubrique avec key
existe 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.- Si
key
n'existe pas dans votreMap
, ou si levalue
pour cette clé estnull
, alors la méthode ajoute lakey-value
paire passée auMap
. - Si
key
existe et sonvalue != null
, alors la méthode change sa valeur en résultat de l'exécution deremappingFunction
. - Si
remappingFunction
renvoienull
, alorskey
est 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 à unMap
, 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.Map.replace(K key, V newValue)
remplacekey
la valeur de parnewValue
, si une telle clé existe. Sinon, rien ne se passe.Map.replace(K key, V oldValue, V newValue)
fait la même chose, mais seulement si la valeur actuelle dekey
est égale àoldValue
.Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
remplace chacunvalue
par le résultat de la fonction.
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 Map
sans 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 !
GO TO FULL VERSION