Vorrei creare un metodo che crea un flusso di elementi che sono prodotti cartesiani di più flussi dati (aggregati allo stesso tipo alla fine da un binario operatore). Si noti che sia gli argomenti che i risultati sono flussi, non raccolte.Prodotto cartesiano di flussi in Java 8 come flusso (utilizzando solo flussi)
Ad esempio, per due flussi di {A, B} e {X, Y} desidero che produce flusso di valori {AX, AY, BX, BY} (semplice concatenazione viene utilizzato per aggregare le stringhe). Finora, ho si avvicinò con questo codice:
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;
}
Questo è il mio caso d'uso desiderato:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("X", "Y")
);
System.out.println(result.collect(Collectors.toList()));
Risultato atteso: AX, AY, BX, BY
.
Un altro esempio: risultato
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("K", "L"),
Stream.of("X", "Y")
);
prevista: AKX, AKY, ALX, ALY, BKX, BKY, BLX, BLY
.
Tuttavia, se corro il codice, ottengo questo errore:
IllegalStateException: flusso è già stato operati o chiuso
Dove è il flusso consumato? Per flatMap? Può essere facilmente risolto?
possibile duplicato (http://stackoverflow.com/questions/32131987/how-can-i-make-cartesian-product-with -java-8-stream) – mkobit
@mkobit: è simile, ma penso che non sia un duplicato, in quanto qui non si lavora con insiemi in argomenti, ma flussi, che possono portare ad un diverso approccio – voho