Exemple de filière inversée

Cela fait beaucoup d`insertions à l`avant des objets ArrayList, donc il ya beaucoup de copie en cours. Encore une fois, nous allons construire un flux appelant triés, une opération de flux intermédiaire, en passant dans Collections. En supposant que nous ne savons pas quel type d`éléments qui flux se compose de, quelle est la façon générique d`inverser n`importe quel flux? L`appel de DescendingIterator nous permet d`itérer sur les éléments dans l`ordre séquentiel inversé. Pour référence je regardais le même problème, je voulais joindre la valeur de chaîne des éléments de flux dans l`ordre inverse. Pour la question générale de la façon d`inverser un flux de tout type, je ne sais pas qu`il ya un “bon” chemin. IntStream fournit la méthode Range pour générer des entiers dans une plage spécifique IntStream. ArrayList dans l`ordre avant d`insérer efficacement collecter les éléments (à la fin de la liste), et listes de goyave. Création d`une méthode statique qui accepte un IntStream nous allons créer un tableau à partir d`un flux, puis utiliser les mêmes techniques que nous trouvons dans inverser les éléments d`un tableau en Java. Java 8 introduit le flux qui est une séquence d`éléments supportant les opérations d`agrégation séquentielles et parallèles. Une autre option pour inverser un tableau est d`utiliser la bibliothèque Apache Commons lang. Java 8 Streams et lambdas. Vous pouvez comparer par l`index des éléments, puis utiliser inversé ().

Cette première méthode stocke les éléments dans un tableau et les lit dans un flux dans l`ordre inverse. Notez que vous pouvez rapidement s`étendre à d`autres types de flux (IntStream,. Beaucoup de solutions ici trier ou inverser le IntStream, mais qui nécessite inutilement de stockage intermédiaire. En outre, il a contribué à introduire un style de programmation fonctionnelle à Java. Dans cet épisode, nous allons montrer comment inverser la position de l`élément tout en conservant l`ordre dans un flux Java 8. Nous avons montré quelques solutions en utilisant uniquement le noyau Java et deux autres solutions qui utilisent des bibliothèques tierces — Commons lang et goyave. Collections. Nous utilisons une variable temporaire pour que nous ne perdions pas la valeur de la position actuelle du tableau pendant l`itération.

En utilisant le même extrait de code ci-dessus et en assignant reversedStream à l`itérateur retourné, nous pouvons créer un nouveau flux à l`aide de StreamSupport et Spliterators. Ce sera horriblement inefficace avec un grand nombre d`éléments, nécessitant O (N ^ 2) copie. Cela nécessite l`utilisation du collecteur. Génération d`un projet Java à partir d`un archétype Maven démarrage rapide, nous allons mettre à jour le projet d`utiliser Java 8 et ajouter les dépendances de JUnit et goyave. Il fonctionne en collectant vers un ArrayList, puis en utilisant la classe ListIterator qui peut itérer dans les deux sens, pour itérer en arrière sur la liste. Ici, nous utilisons la méthode IntStream. Une autre option est d`utiliser la bibliothèque de Google Guava. Il y a quelques façons que je peux penser. Si l`extrait de code précédent est douloureux et que vous avez déjà goyave sur vous CLASSPATH, vous pouvez convertir Iterable à ArrayList en utilisant l`utilitaire de liste de goyave. Si implémenté comparable (ex. méthode Eachrestante. Remarques supplémentaires: la manière la plus simple n`est pas si utile lorsqu`elle est utilisée avec d`autres opérations de flux (la jointure de collecte interrompt le parallélisme).

Nous allons voir quelques façons différentes de le faire en utilisant des solutions Java 8-based pure-certains de ces muter un tableau existant et certains en créer un nouveau. Le chemin d`avance n`a pas cette question, et il conserve également les caractéristiques initiales du flux, par exemple triés, et ainsi, c`est la façon d`aller à utiliser avec d`autres opérations de flux après l`inverse. Par rapport aux exemples précédents, il s`agit d`une façon plus lisible de faire la tâche.