user1127643:
私は、Javaストリームとコレクションを使用してオブジェクトのリストからのカウントと合計して、グループを取得しようとしています。私はどのように私は望ましい結果を達成しないことを確認していません。
InputModel
String month;
BigDecimal salary;
String department;
String noOfEmp;
InputModel [(5月、100、IT、10)、(6月、300、IT、7)、(7月、300、IT、7)、(5月、1000年、HR、5)、(6月、300、HR、7 )、(7、600、HR、5)]
OutputModel
String month
BigDecimal salary
String noOfEmp
予想される出力 OutputModel [(月、1100,15)、(6月、600,14)、(7月、900,12)]
私は、コードの下にしようとしたが、それはしてグループを返され、カウント。
Map<String, Integer> result= inputModels.parallelStream().collect(Collectors.groupingBy(InputModel::getMonth,
LinkedHashMap::new, Collectors.summingInt(InputModel::getNoOfEmp)));
前もって感謝します!!!
ラビンドラRanwala:
あなたが持っていることを考えるOutputModel
場所でクラスを、これはあなたの問題を解決します。
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();
注意の言葉:他のタイプは、より適切な場所良いとは限りませんが、文字列を使用します。たとえば、あなたが使用している必要がありますint
表すために、noOfEmp
代わりにString
。スプリアスデータに実行時エラーの可能性を低減しながら、それはコードを単純化するであろう。また使用することを検討してjava.time.Month
文字列リテラルを使用して年間の反対の月を表すために列挙型を。
ここでは出力があります、
[{月=月、給与= 1100 noOfEmp = 15}、{月= 6月給与= 600、noOfEmp = 14}、{月= 7月給与= 900、noOfEmp = 12}]