0
votes

Comment itérer une grosse liste pour le rendre plus petit pour un appel de repos à l'aide de flux Java?

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 commentaires

"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 * /} . Le drapeau ENTRALISTNOTProcessé est obsolète.


Je pourrais faire ça. Je me demandais simplement s'il y a un meilleur moyen que traditionnel pour les boucles.


4 Réponses :


3
votes

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


0 commentaires

0
votes

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


3 commentaires

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 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 . c) Subliste est une opération de copie libre, car elle crée une vue dans une partie de la liste d'origine . En revanche, votre solution crée de nouvelles listes contenant tous les éléments, ainsi qu'un HASHMAP les utilisent toutes (toutes les listes étant entièrement matérialisées en mémoire avant même que le traitement ne commence).



2
votes

Vous pouvez utiliser GUAVA's itérables.partition ou LISTS.PARTITION

Lists.partition(bigList, 100).forEach(subList -> callRestApi(subList));


0 commentaires

3
votes

Vous pouvez faire semblable à Cette réponse , en créant une plage avec étapes puis subliste : xxx

ou vous pouvez extraire la méthode: xxx

puis xxx


1 commentaires

Au lieu de (i + étape> = biglist.size ())? bigList.Size (): IP + étape , j'utiliserais math.min (i + étape, biglist.size ()) .