Ich möchte eine Methode erstellen, die einen Strom von Elementen erzeugt, die kartesische Produkte mehrerer gegebener Streams sind (am Ende durch eine Binärdatei zum selben Typ zusammengefasst) Operator). Bitte beachten Sie, dass beide Argumente und Ergebnisse Streams sind, nicht Sammlungen.Kartesisches Produkt von Streams in Java 8 als Stream (nur Streams)
beispielsweise für zwei Ströme von {A, B} und {X, Y} Ich würde es Strom von Werten erzeugen mag {AX, AY, BX, BY} (einfache Verkettung verwendet wird, zum Aggregieren der Strings). Bisher habe ich kam mit diesem Code auf:
private static <T> Stream<T> cartesian(BinaryOperator<T> aggregator, Stream<T>... streams) {
Stream<T> result = null;
for (Stream<T> stream : streams) {
if (result == null) {
result = stream;
} else {
result = result.flatMap(m -> stream.map(n -> aggregator.apply(m, n)));
}
}
return result;
}
Dies ist mein Wunsch Anwendungsfall:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("X", "Y")
);
System.out.println(result.collect(Collectors.toList()));
Erwartetes Ergebnis: AX, AY, BX, BY
.
Ein weiteres Beispiel:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("K", "L"),
Stream.of("X", "Y")
);
Erwartetes Ergebnis: AKX, AKY, ALX, ALY, BKX, BKY, BLX, BLY
.
Allerdings, wenn ich den Code ausführen, bekomme ich diesen Fehler:
Illegal: Strom bereits operiert worden ist oder geschlossen
Wo wird der Strom verbraucht? Durch flatMap? Kann es leicht repariert werden?
möglich Duplikat (http://stackoverflow.com/questions/32131987/how-can-i-make-cartesian-product-with -java-8-streams) – mkobit
@mkobit: es ist ähnlich, aber ich denke, es ist kein Duplikat, wie hier arbeiten Sie nicht mit Sammlungen in Argumenten, sondern Streams, die zu einem anderen Ansatz führen können – voho