gpt4 book ai didi

java - 如何使用java流对字段进行分组并创建摘要

转载 作者:行者123 更新时间:2023-12-02 07:34:09 25 4
gpt4 key购买 nike

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()));

进一步,计算 ListCallSummary 类型的摘要:

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());

其中百分比计数由您使用与ItemSummary中选择的数据类型一致的签名int Percentage(long val, long Total)来实现也是如此。

结果示例:

[
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)])
]

关于java - 如何使用java流对字段进行分组并创建摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com