Heim  >  Artikel  >  Java  >  So kehren Sie Streams in Java um: Spezifische und generische Ansätze?

So kehren Sie Streams in Java um: Spezifische und generische Ansätze?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 13:18:03600Durchsuche

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

Streams in Java umkehren: generische und spezifische Ansätze

Beim Umgang mit Java-Streams kann es entscheidend sein, zu verstehen, wie man sie umkehrt. Lassen Sie uns in die spezifischen und allgemeinen Ansätze zum Umkehren von Streams eintauchen.

Spezifischer Ansatz: Umkehren eines IntStream

Um einen IntStream umzukehren und dabei seinen Bereich beizubehalten, können Sie Folgendes verwenden Ansatz:

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

Diese Methode vermeidet unnötige Box- und Sortiervorgänge.

Generischer Ansatz: Umkehren eines Streams jeglicher Art

Für Streams von Bei beliebigen Typen gibt es derzeit keine vordefinierte „richtige“ Möglichkeit, sie umzukehren. Hier sind jedoch zwei gängige Optionen:

1. Umkehren mit Array:

Diese Methode speichert die Stream-Elemente in einem Array und ruft sie in umgekehrter Reihenfolge ab:

<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. Umkehren mit Collector:

Diese Methode verwendet einen Collector, um Elemente in einer umgekehrten Liste zu sammeln:

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

Effiziente Umkehrung mit ArrayDeque

Aufgrund der Ineffizienz des O(N^2)-Kopierens aktualisieren wir unseren vorherigen Code mit einem ArrayDeque für eine effizientere Einfügung an der Vorderseite:

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

Diese Methode erzeugt ein umgekehrtes Deque, das leicht konvertiert werden kann zurück in einen Stream oder direkt iteriert.

Das obige ist der detaillierte Inhalt vonSo kehren Sie Streams in Java um: Spezifische und generische Ansätze?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn