我有很大的按文档ID和版本排序的版本化文档流。
例如。 Av1,Av2,Bv1,Cv1,Cv2
我必须将其转换为另一个Stream,其记录通过文档ID进行汇总。
A [v1,v2],B [v1],C [v1,V2]
可以不使用Collectors.groupBy()
来完成此操作吗?我不想使用groupBy()
,因为它将在分组之前将流中的所有项目加载到内存中。从理论上讲,不需要将整个流加载到内存中,因为它是有序的。
最佳答案
您可以在 groupRuns
中使用StreamEx library:
class Document {
public String id;
public int version;
public Document(String id, int version) {
this.id = id;
this.version = version;
}
public String toString() {
return "Document{"+id+version+ "}";
}
}
public class MyClass {
private static List<Document> docs = asList(
new Document("A", 1),
new Document("A", 2),
new Document("B", 1),
new Document("C", 1),
new Document("C", 2)
);
public static void main(String args[]) {
StreamEx<List<Document>> groups = StreamEx.of(docs).groupRuns((l, r) -> l.id.equals(r.id));
for (List<Document> grp: groups.collect(toList())) {
out.println(grp);
}
}
}
输出:
我无法验证这不会占用整个流,但是我无法想象为什么需要给出
groupRuns
的含义。关于java - 合并Java流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55647767/