Maison >Java >javaDidacticiel >Comment puis-je parcourir efficacement un flux Java 8 avec Index Access ?

Comment puis-je parcourir efficacement un flux Java 8 avec Index Access ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 14:32:17548parcourir

How Can I Efficiently Iterate Through a Java 8 Stream with Index Access?

Itération concise de flux basée sur un index en Java 8

De nombreuses tâches de programmation impliquent une itération sur une structure de données tout en accédant à l'index correspondant. Les flux Java 8 fournissent un large éventail d'opérations pour le traitement des flux, mais il n'existe aucun moyen explicite d'obtenir l'index pendant l'itération.

Le code Java fourni démontre une approche plutôt verbeuse utilisant IntStream, boxed(), zip( ), filter(), map() et collect(). Bien qu'il obtienne le résultat souhaité, sa longueur et sa complexité gâchent son élégance.

Méthode la plus propre :

L'approche la plus concise consiste à partir d'un flux d'indices :

String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"};
IntStream.range(0, names.length)
         .filter(i -> names[i].length() <= i)
         .mapToObj(i -> names[i])
         .collect(Collectors.toList());

Cette méthode construit un flux d'indices de 0 à la longueur du tableau, filtre les indices en fonction de la longueur de la chaîne correspondante, mappe les indices à les chaînes correspondantes et collecte les résultats dans une liste.

Méthode alternative :

Une autre option consiste à maintenir un compteur d'index ad hoc en utilisant un objet mutable comme un AtomicInteger :

String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"};
AtomicInteger index = new AtomicInteger();
List<String> list = Arrays.stream(names)
                          .filter(n -> n.length() <= index.incrementAndGet())
                          .collect(Collectors.toList());

Cette méthode préserve la familiarité de l'incrémentation d'index basée sur une boucle for. Cependant, il convient de noter que l'utilisation de cette méthode sur un flux parallèle peut potentiellement entraîner un comportement incorrect en raison de l'ordre non déterministe du traitement parallèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn