martes, 11 de septiembre de 2018

Stream has already been operated upon or closed

El origen del blog erá crear un librería de post con soluciones de errores comunes que suelo tener, pero ultimamente solo doy la chapa con cosas mas o menos nuevas. Hoy volveremos a retomar esa idea original.

Vamos a hablar de un error que  me dio cuando estuve hacien el post sobre Java 8 y los Streams. Haciendo lo que para mí era algo lógico con los Stream en base a mis conocimientos anteriores, al ejecutar el código me dio el mensaje de error: stream has already been operated upon or closed.

Lo que intentaba era lo siguiente, iterar en un segundo ejemplo sobre el mismo strem:

List<String> list = Arrays.asList("uno", "dos", "tres");
Stream<String> stream = list.stream();
stream.forEach(element -> System.out.println(element));
System.out.println("-------- second example -------");
Stream<String> streaFiltered = stream.filter(element -> element.equals("uno"));
streaFiltered.forEach(element -> System.out.println(element));

El problema viene dado en el funcionamiento de los Steam. Y es que solo tienen permitida una única operación sobre si mismna. Es decir, el Steam será utilizado y cerrado como recurso una vez que realicemos una operación terminal sobre el mismo. Y por tanto no podrá volver a ser utilizado.

la solucion es hacer uso de la interfaz funcional 'Supplier' que nos proveerá del mismo stream todas las veces que queramos.

Supplier<Stream<String>> streamSupplier = () -> Arrays.asList("uno", "dos", "tres").stream();
streamSupplier.get().forEach(element -> System.out.println(element));
System.out.println("-------- second example -------");
Stream<String> streaFiltered = streamSupplier.get().filter(element -> element.equals("uno"));
streaFiltered.forEach(element -> System.out.println(element));

No hay comentarios:

Publicar un comentario