Arjutrrchc:
Tengo una List<BatchDTO>
con la clase siguiente
public class BatchDTO {
private String batchNumber;
private Double quantity;
.
.
//Getters and setters
}
Lo que tengo que hacer es resumir el total si el NÚMERO DE LOTE es duplicado. He utilizado un LinkedHashMap para implementar esto, y lo hicieron las iteraciones. Pero lo que me gustaría tener es una forma más optimizada. ¿Puedo utilizar la corriente para hacer esto de forma optimizada.
private static List<BatchDTO > getBatchDTO (Map<String, BatchDTO > batchmap) {
return batchmap.values().stream().collect(Collectors.toList());
}
private static Map<String, BatchDTO > getBatchMap(List<BatchDTO > batchList, Map<String, BatchDTO > batchMap) {
for (BatchDTO batchDTO : batchList) {
batchMap = getBatchMap(batchMap, batchDTO );
}
return batchMap;
}
private static Map<String, BatchDTO > getBatchMap(Map<String, BatchDTO > batchMap, BatchDTO batchObject) {
String batchCode = batchObject.getBatchNumber();
if(!batchMap.containsKey(batchCode)) {
batchMap.put(batchCode, batchObject);
} else {
batchObject.setQuantity(getTotalQuantity(batchMap,batchObject));
batchMap.put(batchCode, batchObject);
}
return batchMap;
}
private static Double getTotalQuantity(Map<String, BatchDTO > batchmap, BatchDTO batchObject) {
return batchmap.get(batchObject.getBatchNumber()).getQuantity() + batchObject.getQuantity();
}
Ruslan:
Usted podría tratar de usar corriente api el camino @Naman sugerido en los comentarios. Y suponiendo que BatchDTO
tiene todos los argumentos de constructor que podría volver a partir Map
deList<BatchDTO>
List<BatchDTO> collect = list.stream()
.collect(groupingBy(BatchDTO::getBatchNumber, summingDouble(BatchDTO::getQuantity)))
.entrySet().stream()
.map(entry -> new BatchDTO(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
JavaDoc: groupingBy () , summingDouble ()