我有很大的按文档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/

10-11 06:30