java8实现:写一个大数据量出力到csv的共通方法,参数为List<ADto>、ADto.class、filePath,将list出力到csv文件中
时间: 2023-12-14 09:39:07 浏览: 123
以下是一个Java 8的实现,使用了Stream API和Lambda表达式:
```java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.stream.Collectors;
public class CsvWriter {
public static <T> void writeListToCsv(List<T> list, Class<T> clazz, String filePath) throws IOException {
List<String> headers = getHeaders(clazz);
List<String> lines = list.stream()
.map(item -> mapObjectToCsvLine(item, headers))
.collect(Collectors.toList());
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
writer.write(String.join(",", headers));
writer.newLine();
for (String line : lines) {
writer.write(line);
writer.newLine();
}
}
}
private static <T> List<String> getHeaders(Class<T> clazz) {
return List.of(clazz.getDeclaredFields()).stream()
.map(Field::getName)
.collect(Collectors.toList());
}
private static <T> String mapObjectToCsvLine(T item, List<String> headers) {
return headers.stream()
.map(header -> {
try {
Field field = item.getClass().getDeclaredField(header);
field.setAccessible(true);
return field.get(item).toString();
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.joining(","));
}
}
```
使用方法如下:
```java
List<ADto> list = ... // 获取要输出的列表
String filePath = ... // 指定要输出到的文件路径
CsvWriter.writeListToCsv(list, ADto.class, filePath);
```
其中,`ADto`是要输出的类,需要按照CSV文件的格式定义类的属性。例如,如果要输出一个包含`id`和`name`两个属性的类,可以定义为:
```java
public class ADto {
private int id;
private String name;
public ADto(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
```
注意,这里假设类的属性名和CSV文件的列名相同,如果不同的话需要修改`getHeaders()`方法和`mapObjectToCsvLine()`方法。此外,如果要输出的类中包含复杂类型的属性,需要自行处理。
阅读全文