在java中聚合响应的有效方法

时间:2018-04-19 13:40:07

标签: java

我有一个用例,特别是用户可能有一个或多个帐户。 对于每个帐户,我必须调用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。 但我不确定这是否是有效的,也是最好的方法。

我正在寻找关于什么是实现它的最佳方法的想法

3 个答案:

答案 0 :(得分:0)

我想这取决于规则代码集之类的东西。你所展示的是小的,显然是连续的数字;如果这些代码始终如一,那么List<boolean>可能是一个好方法。 Map适用于任何类型和一组键,因此更灵活,几乎可以肯定不是&#34;错误&#34;选择。

另外要考虑的是,如果您正在进行一堆API调用并在收到它们时异步处理它们,那么您需要在数据结构或更新它们的代码中使用线程安全。 / p>

因此,建议您可以使用List或[{1}}实施的ArrayList,或VectorMap实施的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失败规则。因此,将计算将导致汇总的所有帐户。