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!!!
Étant donné que vous avez la OutputModel
classe 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é int
pour représenter au noOfEmp
lieu 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.Month
ENUM 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}]