Heim > Java > javaLernprogramm > Hauptteil

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

Mary-Kate Olsen
Freigeben: 2024-10-30 13:18:03
Original
658 Leute haben es durchsucht

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

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

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

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

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!

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