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!