Cómo llevar a cabo por el grupo, el recuento y la suma de la lista de objetos en una sola corriente y guardar en otra lista de objeto?

user1127643:

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

Ravindra Ranwala:

Teniendo en cuenta que usted tiene OutputModelclase 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 intpara representar noOfEmpen 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.Monthenumeració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}]

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=178117&siteId=1
Recomendado
Clasificación