sgp*_*p15 6 java java-stream collectors
我有很大的按文档ID和版本排序的版本化文档流。
例如,Av1,Av2,Bv1,Cv1,Cv2
我必须将其转换为另一个Stream,其记录通过文档ID进行汇总。
A [v1,v2],B [v1],C [v1,V2]
可以不使用而完成此操作Collectors.groupBy()吗?我不想使用groupBy()它,因为它将在分组之前将流中的所有项目加载到内存中。从理论上讲,不需要将整个流加载到内存中,因为它是有序的。
groupRuns您可以在StreamEx 库中使用以下内容:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
其输出:
[文档{A1},文档{A2}]
[文档{B1}]
[文档{C1},文档{C2}]
我无法验证这不会消耗整个流,但我无法想象为什么它需要给出它的groupRuns意图。