【问题标题】:How to remove if else condition from loop?如何从循环中删除 if else 条件?
【发布时间】:2015-12-01 09:28:41
【问题描述】:

我有一个类似下面的代码sn-p,

public ArrayList getReport(reportJDOList,accountType)
{
    String abc = "";

    for(ReportJDO reportJDO : reportJDOList)
    {
        if(accountType.equals("something")
           abc = reportJDO.getThis();
        else
           abc = reportJDO.getThat();

        //somecode goes here
    }

    returning List;
}

由于我在迭代之前知道 accountType 的值,我不希望对列表中的每个条目进行此检查,因为如果某个实例的 reportJDOList 的大小为 10000,它将导致大量检查。我们如何消除这件事的发生?提前致谢:)

【问题讨论】:

  • 布尔类型IsSomething = accountType.equals("something");现在你有了一个可以在循环中使用的布尔值

标签: java refactoring iteration


【解决方案1】:

您确实可以执行一次检查并实现 2 个循环:

if(accountType.equals("something") {
   for(ReportJDO reportJDO : reportJDOList) {
       abc = reportJDO.getThis();
   }
} else {
   for(ReportJDO reportJDO : reportJDOList) {
       abc = reportJDO.getThat();
   }
}

显然,您可以通过以下任一方式改进您的设计

  1. 将循环分成 2 种不同的方法
  2. 使用命令模式,即在不同的命令中实现循环体并执行循环。
  3. 使用Guava的函数(只是#2的改进)
  4. 使用 java 8 流。

【讨论】:

  • 嗨,亚历克斯,感谢您的回答,我实际上知道 #1 解决方案,但问题是“//some code goes here”部分有很多代码,我认为将它们放入两个循环中会做很多冗余。
  • 为避免重复“这里有一些代码”中的代码,将其提取到可以从两个地方调用的方法中。 @Eran 接受的答案在循环内仍然有一个 if 条件。
【解决方案2】:

如果您想保存字符串比较,请在循环之前进行一次并将结果存储在布尔变量中:

String abc = "";
boolean isThis = accountType.equals("something");
for(ReportJDO reportJDO : reportJDOList) {  
    abc = isThis ? reportJDO.getThis() : reportJDO.getThat();
    //somecode goes here
}

【讨论】:

    【解决方案3】:

    我会投票赞成干净的编码 - 执行一次检查并将逻辑委托给私有方法,每个方法都单独执行循环。这复制了循环的代码,但如果在某些时候您需要在SomethingReport 中做更多在OtherReport 中没有复制的事情,则可以提供最大的灵活性。

       public ArrayList getReport(reportJDOList,accountType) {
         if("soemthing".equals(accountType)) {
           return getSomethingReport(reportJDOList);
         } else {
           return getOtherReport(reportJDOList); 
         }
       }
    
       private ArrayList getSomethingReport(reportJDOList) {
         [...] 
       }
    

    【讨论】:

      【解决方案4】:
      interface AccountHandler {
          String get(Report r);
      }
      
      AccountHandler thisHandler= new AccountHandler() {
          @Override
          public String get(Report r) {
              return r.getThis();
          }
      };  
      AccountHandler thatHandler= new AccountHandler() {
          @Override
          public String get(Report r) {
              return r.getThat();
          }
      };
      
      //...............
      AccountHandler ah;
      ah = (what.equalsIgnoreCase("this")) ? thisHandler : thatHandler;
      Report r=new Report();
      // loop
      ah.get(r);
      

      【讨论】:

      • 在原始代码旁边添加几句话总是很受欢迎。
      【解决方案5】:
      //Using reflection:
      Report r = new Report();
      Method thisMethod = r.getClass().getDeclaredMethod("getThis");
      Method thatMethod = r.getClass().getDeclaredMethod("getThat");
      Method m =  (what.equalsIgnoreCase("this")) ? thisMethod : thatMethod;
      m.invoke(r);        
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        • 2021-11-13
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多