es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , ,

Answer

  1. Avatar for 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étodo close() debe llamarse a la corriente externa, no a la interna.

    Aquí está el código actualizado:

    final Map<string, long=""> productModelQuantityReturnedMap = new HashMap<>();
    
    sampleList.stream()
        .forEach(sampleModel -> sampleModel.getEntries()
            .stream()
            .filter(entryModel -> Objects.nonNull(entryModel.getOrderEntry()))
            .forEach(returnEntryModel -> {
                // procese los datos aquí y actualice el mapa
                productModelQuantityReturnedMap.put(key, val);
            }));
    
    // cerrar la corriente externa
    sampleList.close();
    

    En este código actualizado, se utiliza el método forEach() en lugar del método map(), ya que no estamos transformando los datos sino procesándolos. El método forEach() 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 como ConcurrentHashMap.

    En general, se recomienda utilizar el método forEach() en lugar del método map() al actualizar una estructura de datosmutable como un mapa.</string,>

Comments are closed.