J'ai un HashMap
avec la structure suivante.
Map
La classe Container
contient une List
. Je veux effacer le contenu de cette liste pour que la liste existe mais avec 0 élément. Plus tard, je lui remettrai des valeurs.
Le replaceAll ()
attend une BiFonction
. Pour cette raison, ce qui suit donne une erreur de compilation car le type de retour de clear ()
est void
:
personMap.replaceAll ((k, v) -> v.getMyList (). clear ());
4 Réponses :
Itérer votre Carte
avec forEach
nécessitera un BiConsumer super K,? super V>
(où K
et V
sont les types de clé et de valeur de votre Map
), ce qui vous permettra à terme de invoquez les méthodes void
sur les éléments.
Par exemple
personMap.forEach((k,v) -> v.getMyList().clear());
Honte à moi !! J'aurais dû le faire moi-même. En fait, je suis nouveau dans les flux. Merci beaucoup :)
@Sumit you're welcome :) Je vous suggère d'accepter la réponse de Samuel Philipp au lieu de la mienne. Je pense que c'est un peu mieux.
1ère fois que j'ai trouvé quelqu'un d'aussi généreux !!
@Sumit pas vraiment de générosité. Les questions et réponses sont pour tout le monde. Il est préférable d'accepter la meilleure réponse pour que les personnes qui suivent la voient en premier. En fin de compte, vous voudriez la même chose pour les questions et réponses que vous atteignez lorsque vous recherchez une solution.
Vous pouvez utiliser ceci:
map.values().stream() .map(Container::getMyList) .forEach(List::clear);
Vous pouvez également utiliser ceci:
map.values().forEach(i -> i.getMyList().clear());
Pourquoi l'effacer en premier lieu?
map.forEach((k, v) -> v.setMyList(new ArrayList<>()));
Pourquoi insister pour utiliser replaceAll
si vous ne remplacez rien? Vous pouvez faire de même avec forEach
. En outre, il peut y avoir d'autres références aux listes.
new ArrayList ()
créera inutilement de nouveaux objets. C'est pourquoi je veux l'effacer. Mais merci quand même.
@Sumit, il se peut que la création de ces instances (qui sont très bon marché) sera moins chère que d'effacer vos instances existantes.
Tout d'abord, si vous ciblez un conteneur spécifique: vous devez d'abord utiliser la méthode Map.get.
map.values().forEach(i -> i.getList().clear());
Ensuite, pour effacer la liste
map.get(containerId).getList().clear();
Si vous souhaitez tous les effacer (comme suggéré précédemment):
map.get(containerId);
Pourquoi ne pas utiliser foreach?
map.forEach ((k, v) -> v.getList (). clear ());
devrait fonctionner, non?