どのようにオブジェクトの別のリストに単一のストリームとストア内のオブジェクトのリストから、カウント数との合計でグループを実行するには?

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}]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178113&siteId=1