In meiner Anwendung verwende ich mehrere Streams, die Elemente des Formulars (ID, Wert) bereitstellen. Ein Element wird durch die folgende Klasse definiert:So führen Sie einen äußeren Join bei zwei oder mehr Streams durch
static final class Element<T> implements Comparable<Element<T>> {
final long id;
final T value;
Element(int id, T value) {
this.id = id;
this.value = value;
}
@Override
public int compareTo(Element o) {
return Long.compare(id, o.id);
}
}
Mein Ziel ist es Streams zwei oder mehr der durch das Element-IDs zu verbinden (in jedem Strom werden die IDs sortiert und streng monotone), zB:
Stream <Element> colour = Arrays.stream(new Element[]{new Element(1, "red"), new Element(2, "green"), new Element(4, "red"), new Element(6, "blue")});
Stream <Element> length = Arrays.stream(new Element[]{new Element(2, 28), new Element(3, 9), new Element(4, 17), new Element(6, 11)});
Stream <Element> mass = Arrays.stream(new Element[]{new Element(1, 87.9f), new Element(2, 21.0f), new Element(3, 107f)});
in einen einzigen Strom, der Elemente der Form (ID, [T1, T2, T3]) enthält:
Stream<Element<Object[]>> allProps = joinStreams(colour, length, mass);
indem irgendein Verfahren wie folgt aus:
public Stream<Element<Object[]>> joinStreams(Stream<Element>... streams) {
return ...;
}
Der resultierende Strom sollte ein FULL OUTER JOIN, das heißt für das obige Beispiel liefern: für solche Aufgaben
1, "red", null, 87.9
2, "green", 28, 21.0
3, null, 9, 107
4, "red" 17, null
6, "blue", 11, null
Seit meiner Erfahrung mit API Java-Streaming recht einfach ist bisher normalerweise Iteratoren ich verwende.
Gibt es eine idiomatische (und effiziente) Möglichkeit, diese Art von Join mit Streams durchzuführen? Gibt es irgendwelche Dienstprogrammbibliotheken, die ich verwenden könnte?
Seitliche Anmerkung: Das Beispiel ist vereinfacht. Die Anwendung empfängt die Daten von etwas wie einem spaltenorientierten Datenspeicher (kein echtes DMBS), der mehrere Gigabyte groß ist und nicht leicht in den Speicher passt. Es gibt auch keine integrierte Unterstützung für diese Art von Join-Operation.
'myElementsStream.collect (Collectors.groupingBy (e -> e.id))'? – fge
Ich habe hier drei Streams - wie definierst du myElementsStream? – Matthias