java8实现:写一个共通方法,参数为List<ADto>、ADto.class、filePath,将list出力到csv文件中。要求大数据量的场合也适用
时间: 2023-12-14 13:39:05 浏览: 64
以下是一个可能的Java8实现,使用了Java8的流式API和CSV库OpenCSV:
```java
import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
public class CsvUtils {
public static <T> void writeListToCsv(List<T> list, Class<T> clazz, String filePath) throws IOException {
FileWriter fileWriter = new FileWriter(filePath);
CSVWriter csvWriter = new CSVWriter(fileWriter);
// 获取所有字段名
String[] fieldNames = getFieldNames(clazz);
// 写入表头
csvWriter.writeNext(fieldNames);
// 写入数据行
list.stream()
.map(CsvUtils::rowData)
.forEach(csvWriter::writeNext);
csvWriter.close();
fileWriter.close();
}
private static <T> String[] rowData(T t) {
return getFieldValues(t).stream()
.map(String::valueOf)
.toArray(String[]::new);
}
private static <T> List<Object> getFieldValues(T t) {
return getFieldNames(t.getClass()).stream()
.map(fieldName -> {
try {
Field field = t.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(t);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
})
.toList();
}
private static <T> String[] getFieldNames(Class<T> clazz) {
return clazz.getDeclaredFields()
.stream()
.map(Field::getName)
.toArray(String[]::new);
}
}
```
使用示例:
```java
List<ADto> list = ...; // 假设有一个ADto的列表
String filePath = "output.csv";
CsvUtils.writeListToCsv(list, ADto.class, filePath);
```
这个实现使用到了Java8的流式API,将列表转换为CSV文件的过程在一个方法中完成。其中,`getFieldNames`方法获取一个类的所有字段名;`getFieldValues`方法获取一个对象的所有字段值;`rowData`方法将一个对象转换为一行CSV数据;`writeListToCsv`方法则是将表头和数据行分别写入CSV文件中。这个实现也支持大数据量的场合,因为它使用了流式API,而不是将整个列表一次性加载到内存中。
阅读全文