グループフィールドにJavaのストリームを使用して要約を作成する方法

ディエゴ・ギマランイス:
public class Call {
    private String status;
    private String callName;
}

私は、コールのリストを持っていると私はこのように、要約を作成する必要があります。

public class CallSummary {
    private String callName;
    private List<ItemSummary> items;
}
public class itemSummary {
    private String status;
    private Integer percentage;
}

私の目標は、いくつかの状況等とのコールの割合を示しています。

INBOUND_CALL : {
FAILED = 30%
SUCCESS = 70%
}

どのように私はそれがJavaの8ストリームやコレクターを使用して行うことができますか?

また:

グループ化の背後にある考え方は、巣になりますが、コール名を持ち、その後、状況に基づく数のルックアップ利用できるような方法です。私はまた、ステータスの列挙を使用することをお勧め

enum CallStatus {
    FAILED, SUCCESS
}

他のクラスにそれを適応させます

class Call {
    private CallStatus status;
    private String callName;
}

そして、あなたは、ネストされたグループ化を実装し、中間結果などを始めることができます:

List<Call> sampleCalls = List.of(new Call(CallStatus.SUCCESS,"naman"),new Call(CallStatus.FAILED,"naman"),
        new Call(CallStatus.SUCCESS,"diego"), new Call(CallStatus.FAILED,"diego"), new Call(CallStatus.SUCCESS,"diego"));

Map<String, Map<CallStatus, Long>> groupedMap = sampleCalls.stream()
        .collect(Collectors.groupingBy(Call::getCallName,
                Collectors.groupingBy(Call::getStatus, Collectors.counting())));

これはあなたの出力を与えるだろう

{diego={FAILED=1, SUCCESS=2}, naman={FAILED=1, SUCCESS=1}}

あなたはさらに良くとして割合を評価することができます。(でそれらを表すけれどもInteger、あなたが、さらにそれらを評価する方法に応じて威力を失う精度。)


さらにそれを解決するために、あなたは別のものを保つことができるMapよう、名前ベースのカウントのルックアップのために:

Map<String, Long> nameBasedCount = calls.stream()
        .collect(Collectors.groupingBy(Call::getCallName, Collectors.counting()));

そして、タイプの更なる、計算の要約CallSummaryListのように:

List<CallSummary> summaries = groupedMap.entrySet().stream()
        .map(entry -> new CallSummary(entry.getKey(), entry.getValue().entrySet()
                .stream()
                .map(en -> new ItemSummary(en.getKey(), percentage(en.getValue(),
                        nameBasedCount.get(entry.getKey()))))
                .collect(Collectors.toList()))
        ).collect(Collectors.toList());

どこpercentageカウントが署名使って、あなたによって実装することint percentage(long val, long total)で選択したデータ型と一致ItemSummaryだけでなく、を。

サンプルの結果:

[
CallSummary(callName=diego, items=[ItemSummary(status=FAILED, percentage=33), ItemSummary(status=SUCCESS, percentage=66)]), 
CallSummary(callName=naman, items=[ItemSummary(status=FAILED, percentage=50), ItemSummary(status=SUCCESS, percentage=50)])
]

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=4108&siteId=1