Comment effectuer par groupe, le nombre et la somme de la liste des objets dans le flux unique et stocker dans une autre liste d'objets?

user1127643:

Je suis en train de faire le groupe par, le nombre et la somme de la liste de l'objet en utilisant flux java et collection. Je ne sais pas comment puis-je obtenir le résultat souhaité.

InputModel

String month;
BigDecimal salary;
String department;
String noOfEmp;

InputModel [(mai, 100, IT, 10), (Juin, 300, IT, 7), (Juillet, 300, IT, 7), (mai 1000, HR, 5), (Juin, 300, HR, 7 ), (Juillet, 600, HR, 5)]

OutputModel

String month
BigDecimal salary
String noOfEmp

Résultats escomptés OutputModel [(mai 1100,15), (Juin, 600,14), (Juillet, 900,12)]

J'ai essayé ci-dessous le code, mais il est revenu par groupe et le comte.

Map<String, Integer> result= inputModels.parallelStream().collect(Collectors.groupingBy(InputModel::getMonth,
            LinkedHashMap::new, Collectors.summingInt(InputModel::getNoOfEmp)));

Merci d'avance!!!

Ravindra Ranwala:

Étant donné que vous avez la OutputModelclasse en place, cela va résoudre votre problème.

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();

Mise en garde: Mieux vaut ne pas utiliser des chaînes où d' autres types sont plus appropriés. Pour une instance , vous devriez avoir utilisé intpour représenter au noOfEmplieu d'un String. Cela simplifierait le code tout en réduisant la possibilité d'erreurs d'exécution en raison de données fausses. En outre envisager d' utiliser java.time.MonthENUM pour représenter le mois de l'année contrairement à l' utilisation littéraux cordes.

Voici la sortie,

[{Mois = mai, le salaire = 1100, noOfEmp = 15}, {mois = Juin, salaire = 600, noOfEmp = 14}, {mois = Juillet, salaire = 900, noOfEmp = 12}]

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=178115&siteId=1
conseillé
Classement