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>
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>
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>
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>
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!