分组背后的想法是嵌套是这样一种方式,即您有一个调用名称,然后可以使用基于状态的计数查找。我还建议对状态使用枚举
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 中CallSummary 类型的摘要为:
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)])
]