Heim  >  Artikel  >  Java  >  Wie kann man Streams in Java 8 effizient umkehren?

Wie kann man Streams in Java 8 effizient umkehren?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 00:33:28501Durchsuche

 How to Efficiently Reverse Streams in Java 8?

Erkunden von Stream-Umkehrtechniken in Java 8

Beim Umgang mit Streams in Java 8 ist es nicht ungewöhnlich, dass die Reihenfolge umgekehrt werden muss. Um den richtigen Ansatz zum Umkehren eines Streams zu ermitteln, beschäftigen wir uns mit der spezifischen Herausforderung des Umkehrens eines IntStreams und erkunden gleichzeitig zusätzliche Lösungen zum Umkehren von Streams jeglicher Art.

IntStream-Umkehr:*

IntStream bietet eine range()-Methode zum Generieren von Ganzzahlen innerhalb eines angegebenen Bereichs. Um den Bereich umzukehren, passen Sie einfach die Argumente an:

<code class="java">IntStream.range(-range, 0)</code>

Dieser Ansatz ist jedoch unpraktisch und Integer::compare kann aufgrund von Compilerfehlern nicht verwendet werden. Betrachten Sie stattdessen den folgenden Code:

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

Diese Methode kehrt den Bereich ohne Boxen oder Sortieren um.

Allgemeine Stream-Umkehr:

Es gibt Es gibt mehrere Möglichkeiten, Streams jeglicher Art umzukehren, aber beide erfordern das Speichern der Elemente.

Array-basierte Umkehrung:

Diese Methode verwendet ein Array, um Elemente für das anschließende Einlesen zu speichern umgekehrte Reihenfolge:

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

Collector-basierte Umkehrung:

Collectors können verwendet werden, 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>

While Dies ist effektiv, es löst viele ArrayList.add(0, ...)-Einfügungen aus, was zu übermäßigem Kopieren führt.

Effiziente kollektorbasierte Umkehrung:

Um das zu mildern Nachteil des Kopierens: Erwägen Sie die Verwendung eines ArrayDeque, das effiziente Einfügungen an der Vorderseite unterstützt:

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

Dieser aktualisierte Code behält die Effizienz der Collector-basierten Umkehrung bei und eliminiert gleichzeitig unnötiges Kopieren.

Das obige ist der detaillierte Inhalt vonWie kann man Streams in Java 8 effizient umkehren?. 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