You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构返回不同类型List的CSV读取方法?

重构方案:通用泛型方法

哥们,你这四个方法明显是复制粘贴出来的,重复代码不仅看着闹心,后续维护也麻烦。咱们可以用Java泛型把它们整合成一个通用方法,一次性解决重复问题,还能提升代码的可维护性。

先拆解下重复逻辑:四个方法的核心流程完全一致,唯一的差异就是要解析的目标实体类(PersonFirstName/Street/City/PersonLastName)。所以咱们把这个类作为参数传入,用泛型来适配不同的返回类型就行。

重构后的代码

import org.apache.commons.csv.CsvToBean;
import org.apache.commons.csv.CsvToBeanBuilder;

import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;

public class CsvReader {

    // 通用CSV读取方法
    public <T> List<T> readCsv(Path path, Class<T> targetClass) throws IOException {
        // 用try-with-resources自动关闭FileReader,避免资源泄漏
        try (FileReader reader = new FileReader(path.toString())) {
            CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(reader)
                    .withType(targetClass)
                    .withSeparator(';')
                    .build();
            return csvToBean.parse();
        }
    }

    // 原来的四个重复方法现在可以直接删掉了
}

调用示例

现在只需要调用这个通用方法,传入对应的类对象就能得到你要的列表:

// 读取PersonFirstName列表
List<PersonFirstName> firstNames = readCsv(yourPath, PersonFirstName.class);

// 读取Street列表
List<Street> streets = readCsv(yourPath, Street.class);

// 读取City列表
List<City> cities = readCsv(yourPath, City.class);

// 读取PersonLastName列表
List<PersonLastName> lastNames = readCsv(yourPath, PersonLastName.class);

额外优化说明

我特意加了try-with-resources语法——原代码里的FileReader没有手动关闭,会造成资源泄漏,用这个语法能让JVM自动在代码块结束后关闭资源,更安全可靠。

另外,以后如果要修改分隔符、添加解析配置(比如忽略空行、设置字符编码),只需要改这一个通用方法就行,不用再逐个修改四个重复方法,维护成本直接降到原来的1/4!

内容的提问来源于stack exchange,提问作者dredster01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:49:07