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();
}
}
显然,您可以通过以下两种方法改进您的设计:
我会投票支持干净编码——执行一次检查并将逻辑委托给私有方法,每个方法单独执行循环。这将复制循环的代码,但如果在某个时候您需要在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);