J'ai une liste avec un grand nombre d'éléments. Lors du traitement de cette liste, dans certains cas, je souhaite que la liste soit partitionnée en sous-listes plus petites et, dans certains cas, je souhaite traiter la liste entière.Java: Création de blocs de liste pour traitement
private void processList(List<X> entireList, int partitionSize)
{
Iterator<X> entireListIterator = entireList.iterator();
Iterator<List<X>> chunkOfEntireList = Iterators.partition(entireListIterator, partitionSize);
while (chunkOfEntireList.hasNext()) {
doSomething(chunkOfEntireList.next());
if (chunkOfEntireList.hasNext()) {
doSomethingOnlyIfTheresMore();
}
}
J'utilise com.google.common.collect.Iterators pour la création de partitions. Lien de documentation here Ainsi, dans le cas où je veux diviser la liste avec la taille 100, j'appelle
processList(entireList, 100);
Maintenant, quand je ne veux pas créer des morceaux de la liste, je pensais que je pouvais passer entier. MAX_VALUE en tant que partitionSize.
processList(entireList, Integer.MAX_VALUE);
Mais cela entraîne un manque de mémoire dans mon code. Est-ce que quelqu'un peut m'aider? Qu'est-ce que je rate? Que font les Iterators en interne et comment puis-je surmonter cela?
EDIT: J'ai également besoin de la clause "if" à l'intérieur pour faire quelque chose seulement s'il y a plus de listes à traiter. c'est-à-dire que j'ai besoin de la fonction hasNext() de l'itérateur.
J'ai envisagé de le faire. Mais cela rend le code super moche dans mon cas. Y a-t-il une autre solution que je peux essayer en dehors de Iterators.partition()? –
vous pouvez créer une méthode de partiotion .. alors dans cette méthode, vous pouvez implémenter l'une des 2 solutions proposées. Il ne devrait pas rendre le code moche – stinepike