Maison  >  Article  >  Java  >  Comment inverser les flux dans Java 8 : un guide complet

Comment inverser les flux dans Java 8 : un guide complet

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 17:57:01162parcourir

How to Reverse Streams in Java 8: A Comprehensive Guide

Comment inverser les flux Java : un guide complet

Introduction

Inverser les flux en Java 8 peut être une exigence courante dans divers scénarios. Cet article approfondit les techniques efficaces pour réaliser des inversions de flux, en abordant à la fois des cas spécifiques et généraux.

Cas spécifique : Inverser un IntStream

Pour inverser un IntStream, une approche personnalisée est nécessaire. La méthode revRange suivante génère un IntStream inversé dans une plage donnée :

<code class="java">static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}</code>

Cas général : inversion des flux de tout type

Pour les flux généraux de tout type, il y a existe plusieurs approches :

1. Stocker les éléments et inverser :

Stocker les éléments du flux dans un tableau, puis les lire dans l'ordre inverse :

<code class="java">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]);
}</code>

2. Collecter dans une liste inversée :

Accumuler des éléments dans une liste inversée à l'aide de collecteurs :

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

3. Inversion de liste efficace (mise à jour du 29/01/2016) :

Utilisez un ArrayDeque, qui prend en charge efficacement l'insertion à l'avant, pour éviter toute inefficacité :

<code class="java">Deque<String> output =
    input.collect(Collector.of(
        ArrayDeque::new,
        (deq, t) -> deq.addFirst(t),
        (d1, d2) -> { d2.addAll(d1); return d2; }));</code>

Résumé

Ces techniques fournissent des moyens efficaces d'inverser les flux Java 8. Pour les IntStreams spécifiques, revRange est une solution dédiée. Pour les flux généraux, le stockage d’éléments ou la collecte dans des listes offrent des options pratiques. Pour une efficacité optimale lors de la collecte dans des listes, ArrayDeque doit être utilisé.

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