Por qué el stream anidado no procesa funciones de map o filter cuando hay close() al final.
Tengo un flujo anidado que estoy usando para procesar algunos datos relacionados con un requisito.
final Map<string, long=""> productModelQuantityReturnedMap = new HashMap<>();
sampleList.stream()
.map(sampleModel -> {
sampleModel.getEntries()
.stream()
.filter(entryModel -> Objects.nonNull(entryModel.getOrderEntry()))
.map(returnEntryModel -> {
sampleMap.put(
key,
val);
return null;
}).close();
return null;
}).close();
Sé que usar foreach o para sería lo ideal, pero quería extender esto a un hilo paralelo en el futuro, ya que tiene muchos puntos de datos que no dependen entre sí.
Aunque dice que el flujo o el flujo paralelo esperará hasta que se complete la parte interna, esto va directamente al close()
del flujo exterior, lo cual no entiendo por qué.
¿Alguien puede ayudarme a encontrar el problema aquí?</string,>
davy.ai
Basándonos en el fragmento de código proporcionado, parece que hay un problema con el uso del método
close()
en la corriente interna.El método
close()
se utiliza para cerrar la corriente y liberar cualquier recurso asociado con ella. Sin embargo, en este caso, se llama en el lugar equivocado. El métodoclose()
debe llamarse a la corriente externa, no a la interna.Aquí está el código actualizado:
En este código actualizado, se utiliza el método
forEach()
en lugar del métodomap()
, ya que no estamos transformando los datos sino procesándolos. El métodoforEach()
toma una función de consumidor como argumento, que procesa cada elemento en la corriente.Además, ahora se llama al método
close()
al final de la corriente externa, liberando cualquier recurso asociado con ella.Además, tenga en cuenta que el código anterior no es adecuado para el procesamiento de corrientes paralelas, ya que la variable
productModelQuantityReturnedMap
no es segura para subprocesos. Para usar corrientes paralelas, es necesario modificar el código para utilizar una estructura de datos segura para subprocesos comoConcurrentHashMap
.En general, se recomienda utilizar el método
forEach()
en lugar del métodomap()
al actualizar una estructura de datosmutable como un mapa.</string,>