在我的應用程序中,我使用了幾個提供表單元素(ID,值)的Streams。元素是由下面的類定義:如何在兩個或多個Stream上執行外連接
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);
}
}
我的目標是通過元素的ID來連接兩個或多個流(每個流中的ID進行分類,並嚴格單調),例如:
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)});
到包含形式(ID,[T1,T2,T3])的元素的單個流:通過應用這樣一些方法
Stream<Element<Object[]>> allProps = joinStreams(colour, length, mass);
:
public Stream<Element<Object[]>> joinStreams(Stream<Element>... streams) {
return ...;
}
得到的流應該提供一個FULL OUTER JOIN,即對於上面的例子:
1, "red", null, 87.9
2, "green", 28, 21.0
3, null, 9, 107
4, "red" 17, null
6, "blue", 11, null
因爲我用Java的流API的經驗是很基本的,到目前爲止我通常使用迭代器等任務。
是否有一種習慣(有效)的方式來執行這種Streams連接?有沒有可以使用的實用程序庫?
備註:該示例已簡化。應用程序從類似於面向列的數據存儲庫(沒有真正的DMBS)接收數據,這是幾千兆字節的大小,並不容易放入內存。這種連接操作也沒有內置的支持。
'myElementsStream.collect(Collectors.groupingBy(e - > e.id))'? – fge
我在這裏有三個流 - 你如何定義myElementsStream? – Matthias