【问题标题】:Optimising multiple Java array additions优化多个 Java 数组添加
【发布时间】:2017-02-16 05:46:16
【问题描述】:

我有以下代码

JsonObject domainsObject = new JsonParser().parse(json).getAsJsonObject().get("data").getAsJsonObject();
        this.domain = domainsObject.get("main_domain").getAsString();

        this.domains.add(this.domain);

        for(JsonElement domain : domainsObject.get("addon_domains").getAsJsonArray()) {
            this.domains.add(domain.getAsString());
        }

        for(JsonElement domain : domainsObject.get("parked_domains").getAsJsonArray()) {
            this.domains.add(domain.getAsString());
        }

        for(JsonElement domain : domainsObject.get("sub_domains").getAsJsonArray()) {
            this.domains.add(domain.getAsString());
        }

但是我想适当地优化它,因为似乎有一种方法可以做到这一点而无需反对 DRY。

有没有一种方法可以将 3 个单独的数组和单独的字符串全部压缩到一个数组中,而无需手动循环遍历每个数组?

【问题讨论】:

    标签: java arrays optimization


    【解决方案1】:

    我认为基本上有两种方式,每种方式都有其优点和局限性。

    Grzegorz Górkiewicz 已经提到了一个,一个列表和一个循环。我会使用数组而不是列表:

    String[] parameters = { "addon_domains", "parked_domains", "sub_domains" };
    
    for(String parameter : parameters) {
        for(JsonElement domain : domainsObject.get(parameter).getAsJsonArray()) {
            this.domains.add(domain.getAsString());
        }
    }
    

    如果您更喜欢该列表,请使用Arrays.asList("addon_domains", "parked_domains", "sub_domains")。正如 Chai T. Rex 在评论中提到的,您可以在方法之外声明数组或列表 private static final 以避免每次使用时再次构建它。

    另一种是调用辅助方法:

    addDomainsFromParameter("addon_domains");
    addDomainsFromParameter("parked_domains");
    addDomainsFromParameter("sub_domains");
    

    (您更了解您的程序并且可以找到更好的方法名称。我相信您自己编写方法。)如果在某些时候您需要对处理进行更改,那么您可以添加更多参数方法。

    【讨论】:

    • 对不起,我的错误。
    • 这行得通并且使用最少的代码,所以我会将此标记为正确的。谢谢!
    • 第一个示例的一个建议是将其作为static private final String[] 放在方法头的上方,这样您就不必每次调用该方法时都重新创建数组。
    【解决方案2】:

    将它们放在一个列表中。

    List<String> parameters = new ArrayList<>();
    parameters.add("addon_domains");
    parameters.add("parked_domains");
    parameters.add("sub_domains");
    
    for(String parameter : parameters) {
        for(JsonElement domain : domainsObject.get(parameter).getAsJsonArray()) {
            this.domains.add(domain.getAsString());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-30
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多