合并Java流

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()它,因为它将在分组之前将流中的所有项目加载到内存中。从理论上讲,不需要将整个流加载到内存中,因为它是有序的。

mil*_*ose 0

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意图。