maptoint examples example array java java-8 java-stream reduce collectors

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?