J'ai logique quelque chose comme ça pour traiter en morceaux.
List<String> bigList = getList(); // Returns a big list of 1000 recs int startIndex=0; boolean entireListNotProcessed=false; while(entireListNotProcessed) { int endIndex = startIndex + 100; if(endIndex > myList.size()-1) { endIndex=myList.size()-1; } List<String> subList= bigList.subList(startIndex, endIndex); //call Rest API with subList and update entireListNotProcessed flag... }
4 Réponses :
Vous pouvez utiliser des pibutils de Apache Commons pour faire la scission pour vous ( Si vous avez vraiment besoin depuis 1000, Muuch)
List<List<Integer>> output = ListUtils.partition(largeList, targetSize);
Vous pouvez combiner votre traitement dans des mandrins d'une taille fixe (ou plus de format de lots calculé de manière dynamique).
final List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,); // any range of items. final int batchSize = 3; final AtomicInteger counter = new AtomicInteger(); final Collection<List<Integer>> result = numbers.stream() .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / batchSize)) .values();
Une bonne preuve que "à l'aide de l'API de flux" n'implique pas "mieux".
Serait heureux d'avoir des idées
a) Un compteur externe vaincre l'intention de l'API de flux, car il fait que le code s'appuie sur l'ordre de traitement, qui n'est pas garanti. b) atomicinteger code> ajoute les dépenses des mises à jour de la sécurité du thread, tandis que le code n'est pas en sécurité en sécurité en raison de la dépendance à l'ordre de traitement mentionné dans A i>. c)
Subliste code> est une opération de copie libre, car elle crée une vue dans une partie de la liste
d'origine code>. En revanche, votre solution crée de nouvelles listes contenant tous les éléments, ainsi qu'un
HASHMAP code supplémentaire> les utilisent toutes (toutes les listes étant entièrement matérialisées en mémoire avant même que le traitement ne commence).
Vous pouvez utiliser GUAVA's itérables.partition ou LISTS.PARTITION
Lists.partition(bigList, 100).forEach(subList -> callRestApi(subList));
Vous pouvez faire semblable à Cette réponse , en créant une plage avec étapes puis ou vous pouvez extraire la méthode: p> puis p> subliste code> :
Au lieu de (i + étape> = biglist.size ())? bigList.Size (): IP + étape code>, j'utiliserais
math.min (i + étape, biglist.size ()) code>.
"Retourne une grande liste de 1000 CER" - 1000 éléments est comme rien. Gros serait dans des millions d'éléments.
Quoi qu'il en soit, votre solution me semble bien.
Pourquoi n'utilisez-vous pas une boucle de comptage directe?
pour (int startindex = 0, endidex, taille = biglist.size (); startindex SUBLIST = BigList.Sublist (startindex, endindex = math.min (startindex + 100 , Taille)); / * Traitement du subliste * /} code>. Le drapeau
ENTRALISTNOTProcessé code> est obsolète.
Je pourrais faire ça. Je me demandais simplement s'il y a un meilleur moyen que traditionnel pour les boucles.