Maison >Java >javaDidacticiel >Comment inverser efficacement un flux Java 8 ?

Comment inverser efficacement un flux Java 8 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 05:57:03459parcourir

How to Reverse a Java 8 Stream Efficiently?

Inversion des flux Java 8

Dans Java 8, les flux offrent un moyen puissant et concis de manipuler et de traiter les données. Une opération courante consiste à inverser un flux. Cet article explore deux méthodes pour y parvenir : une solution spécifique pour inverser un IntStream et une approche générique pour inverser tout flux d'objets.

Inversion IntStream spécifique

Pour inverser un IntStream, une méthode personnalisée peut être créée pour mapper la plage de valeurs dans l'ordre inverse. Par exemple, si nous avons un IntStream allant de -5 à 0, l’inverser donnerait un flux de 0 à -5. Ceci peut être réalisé en utilisant le code suivant :

static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}

Cette méthode évite le boxing et le tri, ce qui donne une solution plus efficace.

Inversion de flux générique

Pour inverser les flux de tout type d'objet, deux approches peuvent être utilisées. La première consiste à stocker les éléments du flux dans un tableau et à les lire dans l'ordre inverse :

@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
    Object[] temp = input.toArray();
    return (Stream<T>) IntStream.range(0, temp.length)
                                .mapToObj(i -> temp[temp.length - i - 1]);
}

Cette approche est simple mais nécessite la création d'un tableau intermédiaire.

Une autre technique consiste à utilisez des collecteurs pour accumuler les éléments dans une liste inversée :

Stream<T> input = ... ;
List<T> output =
    input.collect(ArrayList::new,
                  (list, e) -> list.add(0, e),
                  (list1, list2) -> list1.addAll(0, list2));

Cette option nécessite également de stocker les éléments du flux, mais elle élimine le besoin de copie en utilisant une ArrayList avec une insertion à l'avant.

Il convient de noter qu'il n'existe pas de moyen « approprié » d'inverser un flux sans stocker les éléments. Cependant, les méthodes présentées fournissent des solutions efficaces et polyvalentes pour l'inversion spécifique d'IntStream et l'inversion de flux générique.

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