使用单个循环优化 Java 代码:替代多个循环的策略(循环,多个,优化,策略,代码.......)

feifei123 发布于 2025-08-26 阅读(1)

使用单个循环优化 java 代码:替代多个循环的策略

本文旨在帮助开发者优化 Java 代码,特别是当遇到需要多次遍历同一数据集以查找不同类型数据时。我们将探讨如何使用单个循环和标志变量来替代多个循环,从而提高代码的效率和可读性,并提供多种优化策略,包括使用布尔标志、数组和辅助类,以及性能考量。

在处理数据时,经常会遇到需要从同一数据集中提取不同类型的信息的情况。例如,从一个 JSON 响应中提取不同类型的 SMS 模板 ID。 原始代码使用了六个循环来完成这项任务,这导致了代码冗余和潜在的性能问题。 本文将介绍如何使用单个循环和标志变量来优化此代码,从而提高代码的效率和可读性。

优化策略:单个循环与标志变量

最初的代码片段使用了多个独立的 for 循环,每个循环都遍历 jsonResponse 列表以查找特定类型的 SMS 模板 ID。 这种方法效率低下,因为每次循环都会重复遍历整个列表。

一种更优化的方法是使用单个 for 循环,并在循环中使用多个 if 语句来检查不同的模板类型。 为了避免重复执行 if 语句,可以使用标志变量来跟踪是否已经找到了特定类型的模板 ID。

以下是一个示例,展示了如何使用单个循环和布尔标志变量来实现相同的逻辑:

@When("User fetches the sms template from the templates fetched")
public void user_fetches_the_sms_template_from_the_templates_fetched() {
    List jsonResponse = response.jsonPath().getList("$");

    boolean agentMissSet, callerMissSet, agentReceiveSet, callerRecieveSet;
    boolean answeredIvrSet, answeredAAset;

    agentMissSet = callerMissSet = agentReceiveSet =  callerRecieveSet
        = answeredIvrSet = answeredAAset = false;

    for (int i = 0; i < jsonResponse.size(); i++) {
        if (( ! agentMissSet) && 
              getJsonPath(response, "type[" + i + "]").equals  ("agent_sms_missed_call")) {
            agentMissedCallId = getJsonPath(response, "id[" + i + "]");
            agentMissSet = true;
        }

         if (( ! callerMissSet) &&
              getJsonPath(response, "type[" + i + "]").equals ("caller_sms_missed_call")) {
            callerMissedCallSmsId = getJsonPath(response, "id[" + i + "]");
            callerMissSet = true;
          }

         if (( ! agentReceiveSet) &&
              getJsonPath(response, "type[" + i + "]").equals ("agent_sms_received_call")) {
            agentReceivedCallSmsId = getJsonPath(response, "id[" + i + "]");
            agentReceiveSet = true;
          }

         if (( ! callerRecieveSet) &&
              getJsonPath(response, "type[" + i + "]").equals ("caller_sms_received_call")) {
            callerReceivedCallSmsId = getJsonPath(response, "id[" + i + "]");
            callerRecieveSet = true;
          }

         if (( ! answeredIvrSet) &&
              getJsonPath(response, "type[" + i + "]").equals ("answered_on_ivr_sms")) {
            answeredOnIvrSmsId = getJsonPath(response, "id[" + i + "]");
            answeredIvrSet = true;
          }

         if (( ! answeredAAset) &&
              getJsonPath(response, "type[" + i + "]").equals ("answered_on_auto_attendant_sms")) {
            answeredOnAaSmsId = getJsonPath(response, "id[" + i + "]");
            answeredAAset = true;
          }
    }
}

在这个优化后的代码中,我们使用六个布尔变量(agentMissSet、callerMissSet 等)来跟踪是否已经找到了每种类型的模板 ID。 在每个 if 语句中,我们首先检查相应的标志变量是否为 false,然后再检查模板类型。 如果找到了模板 ID,我们将设置相应的标志变量为 true,以防止在后续迭代中重复执行 if 语句。

为了进一步提高效率,可以在找到所有模板 ID 后立即中断循环:

if (agentMissSet && callerMissSet && agentReceiveSet && callerRecieveSet
        && answeredIvrSet && answeredAAset) {
    break;
}
使用数组简化代码

虽然使用布尔标志变量可以提高效率,但代码仍然显得冗长。 为了进一步简化代码,可以使用数组来存储模板 ID 和类型。

以下是一个使用数组的示例:

@When("User fetches the sms template from the templates fetched")
public void user_fetches_the_sms_template_from_the_templates_fetched() {
    List jsonResponse = response.jsonPath().getList("$");
    String[] id = {agentMissedCallId, callerMissedCallSmsId,
                   agentReceivedCallSmsId, callerReceivedCallSmsId,
                   answeredOnIvrSmsId, answeredOnAaSmsId
                  };
    String[] type = {"agent_sms_missed_call", "caller_sms_missed_call",
                   "agent_sms_received_call", "caller_sms_received_call",
                   "answered_on_ivr_sms", "answered_on_auto_attendant_sms"
                  };

    for (int j = 0; j < id.length; j++) {
        for (int i = 0; i < jsonResponse.size(); i++) {
            if (getJsonPath(response, "type[" + i + "]").equals(type[j])) {
                id[j] = getJsonPath(response, "id[" + i + "]");
                break;
            }
        }
    }
}

在这个示例中,我们使用两个数组 id 和 type 来存储模板 ID 和类型。 然后,我们使用两个嵌套的 for 循环来遍历 jsonResponse 列表和 type 数组。 如果找到了匹配的模板类型,我们将更新 id 数组中相应的元素,并中断内部循环。

性能考量

虽然使用单个循环和标志变量或数组可以提高代码的效率,但在某些情况下,性能提升可能并不明显。 例如,如果 jsonResponse 列表非常小,则多次遍历列表的开销可能很小。

在这种情况下,可以考虑使用其他优化技术,例如使用 HashMap 来存储模板类型和 ID。 这可以避免重复遍历列表,并提高查找特定类型模板 ID 的速度。

总结

通过使用单个循环和标志变量或数组,可以显著提高代码的效率和可读性。 在选择优化策略时,需要考虑具体的应用场景和数据规模,并选择最适合的方案。 此外,可以使用 HashMap 等数据结构来进一步提高性能。 记住,代码优化是一个迭代的过程,需要不断地测试和改进才能达到最佳效果。

以上就是使用单个循环优化 Java 代码:替代多个循环的策略的详细内容,更多请关注资源网其它相关文章!

标签:  java red Java json if for 循环 数据结构 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。