我有以下代码
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个单独的数组和单独的字符串压缩成一个数组而不用手动循环每个数组?
答案 0 :(得分:3)
将它们放在一个列表中。
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());
}
}
答案 1 :(得分:3)
我基本上看到两种方式,每种方式都有其优点和局限。
GrzegorzGó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");
(你知道你的程序更好,并且可以找到更好的方法名。我相信你自己编写这个方法。)后者的好处是,如果在某些时候你需要处理的变化,那么你可以添加更多的参数方法。