528 Stimmen

Konvertiere Iterable in Stream mit Java 8 JDK

Ich habe eine Schnittstelle, die java.lang.Iterable zurückgibt.

Ich würde gerne dieses Ergebnis mit der Java 8 Stream-API manipulieren.

Iterable kann jedoch nicht "streamen".

Irgendwelche Ideen, wie man das Iterable als Stream verwenden kann, ohne es in eine Liste umzuwandeln?

6voto

g-t Punkte 1365

Ich habe diese Klasse erstellt:

public class Streams {
    /**
     * Konvertiert Iterable in Stream
     */
    public static  Stream streamOf(final Iterable iterable) {
        return toStream(iterable, false);
    }

    /**
     * Konvertiert Iterable in Parallel-Stream
     */
    public static  Stream parallelStreamOf(final Iterable iterable) {
        return toStream(iterable, true);
    }

    private static  Stream toStream(final Iterable iterable, final boolean isParallel) {
        return StreamSupport.stream(iterable.spliterator(), isParallel);
    }
}

Ich denke, es ist sehr gut lesbar, weil man sich nicht mit Spliteratoren und Booleans (isParallel) beschäftigen muss.

5voto

OldCurmudgeon Punkte 62510

Ein sehr einfacher Work-around für dieses Problem ist es, ein Streamable<T> Interface zu erstellen, das Iterable<T> erweitert und eine default <T> stream() Methode enthält.

interface Streamable<T> extends Iterable<T> {
    default Stream<T> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
}

Jetzt können alle Ihre Iterable<T> einfach in einen Stream umgewandelt werden, indem sie einfach deklariert werden als implements Streamable<T> anstatt von Iterable<T>.

0voto

Grzegorz Piwowarek Punkte 12514

Wenn Sie zufällig Vavr (früher bekannt als Javaslang) verwenden, kann es so einfach sein wie:

Iterable i = //...
Stream.ofAll(i);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X