examples - stream java 8
Acumule un flujo de Java y solo luego procese (1)
Este es un trabajo para java.util.Scanner
. Con el próximo Java 9, escribirías:
List<MyClass> result;
try(Scanner s=new Scanner(Paths.get("data.txt"))) {
result = s.findAll("(//d{1,3}),//s*/"([^/"]*)/"")
//MyClass(int id, String text)
.map(m -> new MyClass(Integer.parseInt(m.group(1)), m.group(2)))
.collect(Collectors.toList());
}
result.forEach(System.out::println);
pero dado que Stream
produce findAll
no existe en Java 8, necesitaremos un método de ayuda:
private static Stream<MatchResult> matches(Scanner s, String pattern) {
Pattern compiled=Pattern.compile(pattern);
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<MatchResult>(1000,
Spliterator.ORDERED|Spliterator.NONNULL) {
@Override
public boolean tryAdvance(Consumer<? super MatchResult> action) {
if(s.findWithinHorizon(compiled, 0)==null) return false;
action.accept(s.match());
return true;
}
}, false);
}
Reemplazando findAll
con este método de ayuda, obtenemos
List<MyClass> result;
try(Scanner s=new Scanner(Paths.get("data.txt"))) {
result = matches(s, "(//d{1,3}),//s*/"([^/"]*)/"")
// MyClass(int id, String text)
.map(m -> new MyClass(Integer.parseInt(m.group(1)), m.group(2)))
.collect(Collectors.toList());
}
Tenía un documento que se parecía a lo siguiente:
data.txt
100, "some text"
101, "more text"
102, "even more text"
Lo procesé utilizando expresiones regulares y devolvió un nuevo documento procesado de la siguiente manera:
Stream<String> lines = Files.lines(Paths.get(data.txt);
Pattern regex = Pattern.compile("([//d{1,3}]),(.*)");
List<MyClass> result =
lines.map(regex::matcher)
.filter(Matcher::find)
.map(m -> new MyClass(m.group(1), m.group(2)) //MyClass(int id, String text)
.collect(Collectors.toList());
Esto devuelve una lista de MyClass procesada. Puede correr en paralelo y todo está bien.
El problema es que ahora tengo esto:
data2.txt
101, "some text
the text continues in the next line
and maybe in the next"
102, "for a random
number
of lines"
103, "until the new pattern of new id comma appears"
Por lo tanto, de alguna manera necesito unir líneas que se están leyendo de la transmisión hasta que aparezca una nueva coincidencia. (Algo así como un buffer?)
Intenté Recoger cadenas y luego recopilé MyClass (), pero sin éxito, porque en realidad no puedo dividir las secuencias.
Reducir viene a la mente para concatenar líneas, pero concatenaré líneas simples y no puedo reducir y generar una nueva secuencia de líneas.
¿Alguna idea de cómo resolver esto con java 8 streams?