Ich versuche, die Gruppe durch, Graf und die Summe aus der Liste des Objekts mit Java-Stream und Sammlung zu erhalten. Ich bin nicht sicher, wie ich das gewünschte Ergebnis zu erzielen.
InputModel
String month;
BigDecimal salary;
String department;
String noOfEmp;
InputModel [(Mai, 100, IT, 10), (Juni 300, IT, 7), (Juli 300, IT, 7), (Mai, 1000, HR, 5), (Juni 300, HR, 7 ), (Juli 600, HR, 5)]
OutputModel
String month
BigDecimal salary
String noOfEmp
Erwartete Ausgabe OutputModel [(Mai 1100,15), (Juni 600,14), (Juli 900,12)]
Ich habe versucht, Code unten, aber es zurück Gruppe und Count.
Map<String, Integer> result= inputModels.parallelStream().collect(Collectors.groupingBy(InputModel::getMonth,
LinkedHashMap::new, Collectors.summingInt(InputModel::getNoOfEmp)));
Danke im Voraus!!!
Vorausgesetzt , dass Sie haben OutputModel
Klasse an Ort und Stelle, wird dies Ihr Problem lösen.
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();
Ein Wort der Warnung: Besser nicht Strings zu verwenden , wo andere Arten mehr geeignet sind. Für eine Instanz haben Sie Folgendes verwendet int
darzustellen , noOfEmp
anstatt ein String
. Das würde den Code vereinfachen und gleichzeitig die Möglichkeit , Laufzeitfehler aufgrund unechter Daten zu reduzieren. Außerdem prüfen , mit java.time.Month
Enum Monat des Jahres entgegen Literale mit String darzustellen.
Hier ist die Ausgabe,
[{Month = Mai Gehalt = 1100, noOfEmp = 15}, {Monat = Juni Gehalt = 600, noOfEmp = 14}, {Monat = Juli Gehalt = 900, noOfEmp = 12}]