ich eine kartesische Produkt Funktion in JavaScript habe:Kartesisches Produkt mit Hilfe von Java-Streams
function cartesianProduct(arr) {
return arr.reduce(function(a,b) {
return a.map(function(x) {
return b.map(function(y) {
return x.concat(y);
});
}).reduce(function(a,b) { return a.concat(b); }, []);
}, [[]]);
}
Also, wenn ich eine 3D-Array habe:
var data = [[['D']], [['E'],['L','M','N']]];
Das Ergebnis cartesianProduct(data)
wäre der 2D-Array:
[['D','E'], ['D','L','M','N']]
Was ich versuche diesen Wagen zu tun ist, schreiben esian Produktfunktion in Java mit Streams.
Bisher habe ich im Anschluss an die in Java:
public Collection<Collection<String>> cartesianProduct(Collection<Collection<Collection<String>>> arr) {
return arr.stream().reduce(new ArrayList<Collection<String>>(), (a, b) -> {
return a.stream().map(x -> {
return b.stream().map(y -> {
return Stream.concat(x.stream(), y.stream());
});
}).reduce(new ArrayList<String>(), (c, d) -> {
return Stream.concat(c, d);
});
});
}
Ich habe eine Art Fehlerprüfung, die besagt:
ArrayList<String>
ist nicht kompatibel mitStream<Stream<String>>
Meine Vermutungen was falsch ist:
- Ich brauche irgendwo einen Kollektor zu verwenden (vielleicht nach dem
Stream.concat
) - Der Datentyp für die Identität falsch
Siehe http://stackoverflow.com/questions/32131987/how-can-i-make-cartesian-product-with-java-8-streams oder http://stackoverflow.com/questions/32631602/cartesian -product-of-streams-in-java-8-as-stream-using-streams-only – Tunaki
Was zur Hölle hat das mit dem Cross-Produkt zu tun? – michaelsnowden
Ich glaube nicht, dass ein Stream hier das richtige Modell ist.Ein Stream nimmt Elemente einer einzelnen Liste/Menge/Pool/was auch immer und macht etwas mit ihnen. Aber Sie versuchen, Elemente aus zwei separaten Entitäten zu übernehmen und sie auf eine bestimmte Art zu kombinieren. Sie können Lambda-Ausdrücke verwenden, um alle Ihre JavaScript-Schließungen darzustellen, aber ich denke nicht, dass ein Stream das richtige Werkzeug ist. – Bobulous