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.

¿Cómo agregar y restar elementos de un objeto específico en una lista usando Java?

Tengo una lista de objetos en una lista como esta, ahora mi requisito aquí es agregar todos los objetos de cantidad (qty) que tienen el mismo id y restar la cantidad aprobada (approvedQty) de la cantidad total (qty), el valor de la cantidad aprobada nunca cambia.

La salida esperada es algo como esto:

[
{
“qty”: 110,
“remainingQty”: 490,
“ids”: “123456”,
“approvedQty”: 600
},
{
“qty”: 100,
“remainingQty”: 245,
“ids”: “12345”,
“approvedQty”: 345
}
]

Estaba intentando algo como esto:

Map<string,></string,>> elementsByItemId = initialItemList.stream()
.collect(Collectors.groupingBy(Items::getIds));

initialItemList = elementsByItemId.entrySet().stream()
.map(entry -> new SaLineItems(entry.getValue().stream().collect(Collectors.summingDouble(Items::getQty)),

                    entry.getKey()))
            .collect(Collectors.toList());

Se agradece cualquier tipo de ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida esperada, puedes seguir estos pasos:

    1. Crea un Map que agrupe los objetos según sus valores de ids.
    2. Para cada grupo de objetos, calcula la suma de sus valores de qty.
    3. Resta el valor de approvedQty del valor total de qty para obtener la cantidad restante.
    4. Crea un nuevo objeto Items con los valores calculados y añádelo a una nueva lista.

    Aquí tienes un ejemplo de un fragmento de código que demuestra este enfoque:

    List<items> listaInicial = // tu lista de objetos
    
    // agrupar los objetos según sus ids
    Map<string,></string,><items>> elementosPorId = listaInicial.stream()
            .collect(Collectors.groupingBy(Items::getIds));
    
    List<items> resultado = new ArrayList<>();
    
    // para cada grupo de objetos, calcular la cantidad restante
    elementosPorId.forEach((ids, listaItems) -> {
        double totalQty = listaItems.stream().mapToDouble(Items::getQty).sum();
        double approvedQty = listaItems.get(0).getApprovedQty();
        double remainingQty = totalQty - approvedQty;
        Items nuevoItem = new Items(totalQty, remainingQty, ids, approvedQty);
        resultado.add(nuevoItem);
    });
    
    // la lista resultado contiene los nuevos objetos con los valores calculados
    System.out.println(resultado);
    

    Ten en cuenta que este código asume que la clase Items tiene un constructor que toma los valores de qty, remainingQty, ids y approvedQty como parámetros. Es posible que necesites ajustar el código dependiendo de la implementación real de la clase Items.

Comments are closed.