Estoy tratando de hacer que el grupo por, recuento y la suma de la lista del objeto usando una secuencia de Java y la recolección. No estoy seguro de cómo puedo conseguir el resultado deseado.
InputModel
String month;
BigDecimal salary;
String department;
String noOfEmp;
InputModel [(mayo de 100, IT, 10), (junio, 300, IT, 7), (Julio, 300, IT, 7), (mayo, 1000, HR, 5), (junio, 300, HR, 7 ), (julio, 600, HR, 5)]
OutputModel
String month
BigDecimal salary
String noOfEmp
Resultados esperados OutputModel [(mayo de 1100,15), (junio, 600,14), (Julio, 900,12)]
Probé a continuación código pero volvió group by y Conde.
Map<String, Integer> result= inputModels.parallelStream().collect(Collectors.groupingBy(InputModel::getMonth,
LinkedHashMap::new, Collectors.summingInt(InputModel::getNoOfEmp)));
¡¡¡Gracias por adelantado!!!
Teniendo en cuenta que usted tiene OutputModel
clase en su lugar, esto va a resolver su problema.
Collection<OutputModel> outputModels = inputModel.stream()
.map(im -> new OutputModel(im.getMonth(), im.getSalary(), im.getNoOfEmp()))
.collect(Collectors.toMap(OutputModel::getMonth, Function.identity(),
(m1, m2) -> new OutputModel(m1.getMonth(), m1.getSalary().add(m2.getSalary()),
String.valueOf(Integer.valueOf(m1.getNoOfEmp()) + Integer.valueOf(m2.getNoOfEmp()))),
LinkedHashMap::new))
.values();
Una advertencia: mejor no usar cadenas en otros tipos son más apropiados. Para un ejemplo que debería haber utilizado int
para representar noOfEmp
en lugar de una String
. Eso sería simplificar el código de tiempo que se reduce la posibilidad de errores de tiempo de ejecución debido a los datos espurios. Por otra parte considerar el uso de java.time.Month
enumeración para representar los meses del año contrariamente a utilizar literales de cadena.
Aquí está la salida,
[{Mes = mayo, salario = 1,100, noOfEmp = 15}, {mes = junio de salario = 600, noOfEmp = 14}, {mes = julio de salario = 900, noOfEmp = 12}]