ディエゴ・ギマランイス:
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()));
そして、タイプの更なる、計算の要約CallSummary
でList
のように:
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)])
]