我有一个用例,特别是用户可能有一个或多个帐户。 对于每个帐户,我必须调用rest api,api对一个帐户的响应如下所示。
{
"succ": [
{
"ruleCode": "1"
},
{
"ruleCode": "4"
},
{
"ruleCode": "6"
},
{
"ruleCode": "7"
},
{
"ruleCode": "8"
},
{
"ruleCode": "9"
}
],
"fail": [
{
"ruleCode": "2"
},
{
"ruleCode": "3"
},
{
"ruleCode": "5"
},
{
"ruleCode": "6"
}
]
}
在为所有帐户运行api之后,我需要聚合响应以查看聚合成功规则和失败规则是什么。
我正在考虑使用map,其中key是rulecode,value是true / false。当特定规则成功时,将值更新为true。 但我不确定这是否是有效的,也是最好的方法。
我正在寻找关于什么是实现它的最佳方法的想法
答案 0 :(得分:0)
我想这取决于规则代码集之类的东西。你所展示的是小的,显然是连续的数字;如果这些代码始终如一,那么List<boolean>
可能是一个好方法。 Map
适用于任何类型和一组键,因此更灵活,几乎可以肯定不是&#34;错误&#34;选择。
另外要考虑的是,如果您正在进行一堆API调用并在收到它们时异步处理它们,那么您需要在数据结构或更新它们的代码中使用线程安全。 / p>
因此,建议您可以使用List
或[{1}}实施的ArrayList
,或Vector
或Map
实施的HashMap
,都是合理的选择。
事情就是这样......看起来你正在处理一小部分价值观。即使这仅仅是一个样本而真实的集合稍微大一些,但问题是:对于最有效的&#34;实现。如果它不是非常低效,那么系统的性能很可能主要由那些远程调用定义,而不是用于聚合结果的数据结构。
不要过度优化。选择一个有意义的结构并为您提供可读,可维护的代码,如果/当遇到性能问题时,请进行调整以解决它。
答案 1 :(得分:0)
这样的事情怎么样?对于已通过和失败的规则,请单独Set
:
private static class RulesResults {
private Set<String> passedRules = new HashSet<>();
private Set<String> failedRules = new HashSet<>();
/** Merges other RulesResults into this result, mutates this result */
public void mergeResults(RulesResults other) {
this.passedRules.addAll(other.passedRules);
this.failedRules.addAll(other.failedRules);
this.failedRules.removeAll(this.passedRules);
}
}
或者,如果您仍想使用Map
,那么您可以这样做。
public Map<String, Boolean> mergeResults(Map<String, Boolean> map1, Map<String, Boolean> map2){
// combine the streams of results
return Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(
// collect to map with collision handling
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
// collision handler: if either are true, map to true, else false
(origVal, newVal) -> { return origVal || newVal; }
)
);
}
答案 2 :(得分:-1)
对于每个帐户,您可以计算成功规则并添加它们。对于每个帐户,如果有n个成功规则,则存在9-n失败规则。因此,将计算将导致汇总的所有帐户。