Heim >Java >javaLernprogramm >Wie kann man einen Java 8-Stream effizient umkehren?

Wie kann man einen Java 8-Stream effizient umkehren?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 05:57:03454Durchsuche

How to Reverse a Java 8 Stream Efficiently?

Umkehren von Java 8-Streams

In Java 8 bieten Streams eine leistungsstarke und übersichtliche Möglichkeit, Daten zu manipulieren und zu verarbeiten. Eine häufige Operation ist das Umkehren eines Streams. In diesem Artikel werden zwei Methoden untersucht, um dies zu erreichen: eine spezifische Lösung zum Umkehren eines IntStreams und ein generischer Ansatz zum Umkehren eines beliebigen Objektstroms.

Spezifische IntStream-Umkehr

Zur Umkehrung Als IntStream kann eine benutzerdefinierte Methode erstellt werden, um den Wertebereich in umgekehrter Reihenfolge abzubilden. Wenn wir beispielsweise einen IntStream im Bereich von -5 bis 0 haben, würde eine Umkehrung zum Stream 0 bis -5 führen. Dies kann mit dem folgenden Code erreicht werden:

static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}

Diese Methode vermeidet Boxen und Sortieren, was zu einer effizienteren Lösung führt.

Generische Stream-Umkehr

Zum Umkehren von Streams beliebiger Objekttypen können zwei Ansätze verwendet werden. Die erste besteht darin, die Stream-Elemente in einem Array zu speichern und sie in umgekehrter Reihenfolge auszulesen:

@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]);
}

Dieser Ansatz ist unkompliziert, erfordert jedoch die Erstellung eines Zwischenarrays.

Eine andere Technik besteht darin, Verwenden Sie Collectors, um die Elemente in einer umgekehrten Liste zu sammeln:

Stream<T> input = ... ;
List<T> output =
    input.collect(ArrayList::new,
                  (list, e) -> list.add(0, e),
                  (list1, list2) -> list1.addAll(0, list2));

Diese Option erfordert auch das Speichern der Stream-Elemente, macht aber das Kopieren überflüssig, indem eine ArrayList mit einer Einfügung am Anfang verwendet wird.

Es ist erwähnenswert, dass es keine „richtige“ Möglichkeit gibt, einen Stream umzukehren, ohne die Elemente zu speichern. Die vorgestellten Methoden bieten jedoch effiziente und vielseitige Lösungen sowohl für die spezifische IntStream-Umkehr als auch für die generische Stream-Umkehr.

Das obige ist der detaillierte Inhalt vonWie kann man einen Java 8-Stream 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