在我的应用程序中,我使用了几个提供表单元素(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