如何避免在 Java 中重复 for 循环?

How to avoid repeatng for loops in Java?

我有一个代码可以正常工作,但它看起来太大了,因为它有重复的代码行,有人可以帮我把它缩短吗?

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 方法示例 class Sport:

public class Sport
{
     // codes omitted

    public String writeData(String file)
    {
        return title + type + cost + location;
    }
    // codes omitted
}

正如您所注意到的,for 循环对于在写入文件时按顺序细分数据是必要的,但这样做会使代码变得更长和重复,我想不出一种有效的方法来缩短它。

这是一个 classic 案例,您可以利用接口和继承。特别是,我会定义一个所有 class 都可以继承的接口。

然后,我将在 writeToFile 所在的 class 中定义一个私有方法,它仅在给定的 Line.
[ 上实现 for 循环=15=]

最后,您只需在 writeToFile 中为每个地图调用该方法即可。然而,我会稍微改变一下实现,因为最好的做法是使用 try-with-resource 块,它保证在离开块之前始终关闭流,即使在可能出现异常的情况下也是如此。

为了让您了解我所指的内容,这里有一个可能的实施示例:

import java.util.*;
import java.io.*;

interface Line {
    String getType();
    default void writeData(PrintWriter pWrite) {
        pWrite.println("I am a " + getType());
    }
}

class Auto implements Line {
    public String getType() {
        return "Auto";
    }
}

class Sport implements Line {
    public String getType() {
        return "Sport";
    }
}

class Animal implements Line {
    public String getType() {
        return "Animal";
    }
}

public class Test {
    private Map<String, Line> itemMap;
    
    public Test() {
        initMap();
    }
    
    private void initMap() {
        itemMap = new HashMap<>();
        itemMap.put("auto1", new Auto());
        itemMap.put("sport1", new Sport());
        itemMap.put("animal1", new Animal());
    }
    
    public static void main(String ... args) throws IOException {
        
        new Test().writeToFile("Test.txt");
    }
    
    public void writeToFile(String file) throws IOException {
        try (PrintWriter pWrite = new PrintWriter(file);) {
                writeLineToFile(pWrite, itemMap);
        }
        // catch block omitted
    }
    
    private void writeLineToFile(PrintWriter pWrite, Map<String, Line> map) {
        for (Line line : map.values()) {
            //Common part
            line.writeData(pWrite);
        }
    }
}

文件内容如下:

I am a Sport
I am a Animal
I am a Auto

在我看来,它看起来更干净,也更容易维护。

当然,这只是一个想法,您可以根据需要进行个性化和添加更多的东西,尤其是利用继承,可能性是无限的。

确保 NatureSportAnimal 都实现一个接口,例如:

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); 
    } 
}