Maison > Java > javaDidacticiel > le corps du texte

Comment inverser les flux en Java : approches spécifiques et génériques ?

Mary-Kate Olsen
Libérer: 2024-10-30 13:18:03
original
600 Les gens l'ont consulté

How to Reverse Streams in Java: Specific and Generic Approaches?

Inverser les flux en Java : approches génériques et spécifiques

Lorsque vous traitez des flux Java, comprendre comment les inverser peut être crucial. Examinons les approches spécifiques et génériques pour inverser les flux.

Approche spécifique : Inverser un IntStream

Pour inverser un IntStream tout en conservant sa plage, vous pouvez utiliser ce qui suit approche :

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

Cette méthode évite les opérations de boxe et de tri inutiles.

Approche générique : Inverser un flux de tout type

Pour les flux de types arbitraires, il n’existe actuellement aucun moyen « approprié » prédéfini de les inverser. Cependant, voici deux options courantes :

1. Inversion à l'aide d'un tableau :

Cette méthode stocke les éléments du flux dans un tableau et les récupère dans l'ordre inverse :

<code class="java">@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]);
}</code>
Copier après la connexion

2. Inversion à l'aide d'un collecteur :

Cette méthode utilise un collecteur pour accumuler des éléments dans une liste inversée :

<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>
Copier après la connexion

Inversion efficace à l'aide d'ArrayDeque

En raison de son inefficacité de copie O(N^2), nous mettons à jour notre code précédent en utilisant un ArrayDeque pour une insertion plus efficace à l'avant :

<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>
Copier après la connexion

Cette méthode produit un Deque inversé, qui peut être facilement converti retour dans un Stream ou itéré directement.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!