正在为 Java 中的多个循环生成 csv 文件?

Generating csv file for multiple loop in Java?

我正在尝试生成一个包含级联值的报告,如下所示:

| Country      | City     | Town     |
--------------------------------------
| Country A    | City X   | Town 1   |
| Country A    | City X   | Town 2   |
| Country A    | City Y   | Town 1   |
| Country A    | City Y   | Town 2   |
| Country B    | City Q   | Town 1   |
| Country B    | City Q   | Town 2   |
| Country B    | City T   | Town 1   |
| Country B    | City T   | Town 2   |


我可以如上所示正确生成国家和城市,但我为每个城市传递了一个 j 索引值,如下所示。但是,对于城镇,我还需要另一个索引变量,例如 k 和 loop.

public MultipartFile exportData() throws IOException {

    // code omitted for brevity

    int rowCount = 0;
    final List<CountryDTO> countryList = countryService.findAll();

    int iSize = countryList.size();
    for (int i = 0; i < iSize; i++) {
        int jSize = countryList.get(i).getCityList().size();
        for (int j = 0; j < jSize; j++) {
            int kSize = countryList.get(i).getCityList().get(j).getTownList().size();
            for (int j = 0; k < kSize; k++) {
                Row row = sheet.createRow(rowCount++);
                write(countryList.get(i), row, j, k);
            }
        }
    }

    // code omitted for brevity
}

private static void write(CountryDTO country, Row row, int j) {

    Cell cell = row.createCell(0);
    cell.setCellValue(country.getName());

    cell = row.createCell(1);
    cell.setCellValue(country.getCityList().get(j).getName());

    cell = row.createCell(2);
    cell.setCellValue(country.getCityList().get(j).getTownList().get(k).getName());
}

我不确定是否有更好的方法。由于我是在 Java 中生成报告的新手,所以我不知道如何继续使用以下方法(如果可以的话,我会使用这种方法,因为它已经在当前项目中使用过)。

每个

您可以使用 for-each 语法而不是索引 for 循环。

for( Country country : countryService.findAll() )
{
    for( City city : country.getCityList() )
    {
        for( Town town : city.getTownList() )
        {
            write( country , city , town ) ;
        }
    }
}

请注意,我们将 write 方法重新定义为忽略原始数据结构。它的工作是写入数据,而不是检索数据。不需要该方法来理解嵌套列表。

继续研究 Separation Of Concerns. A method and a class should know as little about the outside world as possible. This prevents your code from becoming “brittle”,其中一个小改动会导致您的代码到处乱码。

记录

我会在 Java 16+ 中更进一步,将 record 对象传递给 write 方法。记录是编写 class 的简短方式,其主要目的是透明且不可变地传递数据。编译器隐式创建构造函数、getter、equals & hashCodetoString.

record CountryCityTown( String country , String city , String town ) {}

更改 write 方法以获取该类型的单个对象。

void write ( CountryCityTown countryCityTown ) { … }