Tengo muy grande Arroyo de documentos versionados ordenados por ID de documento y la versión.
Por ejemplo, AV1, AV2, BV1, Cv1, Cv2
Tengo que convertir esto en otra corriente cuyos registros se agregan por documento de identificación.
A [v1, v2], B [v1], C [v1, V2]
¿Es posible hacerlo sin usar Collectors.groupBy()
? No quiero usar groupBy()
porque va a cargar todos los elementos de la corriente en memoria antes de agruparlas. En teoría, uno no necesita cargar toda la corriente en la memoria, ya que se le ordena.
Se puede utilizar groupRuns
en la biblioteca StreamEx para esto:
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);
}
}
}
qué salidas:
[Documento {A1}, Documento {A2}]
[Documento {B1}]
[Documento {C1}, Documento {C2}]
No puedo verificar esto no consume toda la corriente, pero no puedo imaginar por qué tendría que dado lo que groupRuns
se pretende hacer.