Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从循环中删除if-else条件?_Java_Refactoring_Iteration - Fatal编程技术网

Java 如何从循环中删除if-else条件?

Java 如何从循环中删除if-else条件?,java,refactoring,iteration,Java,Refactoring,Iteration,我有一个类似于下面的代码片段 public ArrayList getReport(reportJDOList,accountType) { String abc = ""; for(ReportJDO reportJDO : reportJDOList) { if(accountType.equals("something") abc = reportJDO.getThis(); else a

我有一个类似于下面的代码片段

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,则会导致大量的检查。我们如何避免这件事发生?提前感谢:)

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

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

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

if(accountType.equals("something") {
   for(ReportJDO reportJDO : reportJDOList) {
       abc = reportJDO.getThis();
   }
} else {
   for(ReportJDO reportJDO : reportJDOList) {
       abc = reportJDO.getThat();
   }
}
显然,您可以通过以下两种方法改进您的设计:

  • 将循环分为两种不同的方法
  • 使用命令模式,即在不同的命令中实现循环体并执行循环体
  • 使用番石榴的功能(这只是对#2的改进)
  • 使用Java8流
    我会投票支持干净编码——执行一次检查并将逻辑委托给私有方法,每个方法单独执行循环。这将复制循环的代码,但如果在某个时候您需要在SomethingReport中执行其他报表中不重复的操作,则会提供最大的灵活性

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

    嗨,Alex,谢谢你的回答,我实际上知道#1解决方案,但问题是“//有些代码在这里”部分有很多代码,我认为放入两个循环会产生很多冗余。为了避免重复“有些代码在这里”中的代码,将其提取到一个可以从两个地方调用的方法中。@Eran接受的答案在循环中仍然有一个if条件。布尔类型something=accountType.equals(“某物”);现在,您有了一个布尔值,可以在循环中使用。在原始代码旁边,通常会添加一些注释。
    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);
    
    //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);