2
votes

Comment effacer le contenu d'une liste qui se trouve à l'intérieur d'une valeur HashMap à l'aide du flux Java 8

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 ());


2 commentaires

Pourquoi ne pas utiliser foreach?


map.forEach ((k, v) -> v.getList (). clear ()); devrait fonctionner, non?


4 Réponses :


3
votes

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());


4 commentaires

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.



5
votes

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());


0 commentaires

0
votes

Pourquoi l'effacer en premier lieu?

map.forEach((k, v) -> v.setMyList(new ArrayList<>()));


3 commentaires

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.



0
votes

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);


0 commentaires