如何避免在Java中重复for循环?
我有一个运行良好的代码,但它看起来太大了,因为它有重复的代码行,有人能帮我把它缩短吗?
public void writeToFile(String file)
{
try
{
PrintWriter pWrite = new PrintWriter(file);
pWriter.println("[Auto data]");
for (Auto line : autoMap.values())
{
if (line instanceof Auto)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Nature data]");
for (Nature line : natureMap.values())
{
if (line instanceof Nature)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Sport data]");
for (Sport line : sportMap.values())
{
if (line instanceof Sport)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Animal data]");
for (Animal line : animalMap.values())
{
if (line instanceof Animal)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWrite.close();
}
// catch block omitted
}
writeData 方法示例类 Sport:
public class Sport
{
// codes omitted
public String writeData(String file)
{
return title + type + cost + location;
}
// codes omitted
}
正如您已经注意到,在写入文件时,必须使用 for 循环来按顺序细分数据,但这样做会使代码变得更长且重复,我想不出一种有效的方法来缩短它。
回答
确保Nature、Sport和Animal都实现了一个接口,例如:
public interface Writable {
public String writeData(String file);
}
并且由于每个 Map 的所有元素都实现了接口,因此可以提取重复的代码,并将 Map 传递给使用该接口的新方法:
public void writeToFile(String file) {
PrintWriter pWriter = new PrintWriter(file);
pWriter.println("[Auto data]");
writeDataToFile(file, pWriter, autoMap);
pWriter.println();
pWriter.println("[Nature data]");
writeDataToFile(file, pWriter, natureMap);
pWriter.println();
pWriter.println("[Animal data]");
writeDataToFile(file, pWriter, animalMap);
pWrite.close();
}
// assuming the map key is a string
private void writeDataToFile(String file, PrintWriter pWriter, Map<String, Writable> data) {
for (Writable line : data.values()) {
String getLine = line.writeData(file);
pWriter.println(getLine);
}
}