Heim > Java > javaLernprogramm > Hauptteil

Wie kann man Streams in Java 8 effizient umkehren?

Susan Sarandon
Freigeben: 2024-11-01 00:33:28
Original
575 Leute haben es durchsucht

 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage