当ADto中有次位为大写字母的字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且次位为大写字母的字段只出力一次
时间: 2023-12-14 13:36:04 浏览: 29
可以尝试使用反射和Set集合来实现该需求。具体的步骤如下:
1. 定义一个方法,接收参数为List<ADto>、Class<T>、String,其中List<ADto>表示需要导出的数据,Class<T>表示数据类型,String表示文件路径。
```
public static <T> void exportToCsv(List<T> dataList, Class<T> clazz, String filePath) {
// TODO
}
```
2. 使用反射获取所有字段,并找到次位为大写字母的字段。
```
Field[] fields = clazz.getDeclaredFields(); // 获取所有字段
Set<String> upperCaseFields = new HashSet<>(); // 存储次位为大写字母的字段
for (Field field : fields) {
String fieldName = field.getName();
if (fieldName.length() >= 2 && Character.isUpperCase(fieldName.charAt(1))) {
upperCaseFields.add(fieldName);
}
}
```
3. 将数据写入csv文件中。在写入每一行数据之前,先判断该行是否已经输出过次位为大写字母的字段,如果已经输出,则不再输出,否则输出该字段并将其标记为已输出。
```
try (CSVPrinter printer = new CSVPrinter(new FileWriter(filePath), CSVFormat.DEFAULT)) {
// 输出表头
List<String> headerList = new ArrayList<>();
for (Field field : fields) {
headerList.add(field.getName());
}
printer.printRecord(headerList);
// 输出数据
Set<String> printedFields = new HashSet<>(); // 存储已经输出过的字段
for (T data : dataList) {
List<String> recordList = new ArrayList<>();
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(data);
if (value == null) {
recordList.add("");
} else {
recordList.add(value.toString());
}
if (printedFields.contains(field.getName()) || !upperCaseFields.contains(field.getName())) {
continue; // 已经输出过或者不是次位为大写字母的字段,则不需要再输出
}
printer.print(field.getName()); // 输出次位为大写字母的字段
printedFields.add(field.getName()); // 标记为已输出
}
printer.printRecord(recordList);
}
} catch (IOException e) {
e.printStackTrace();
}
```
完整代码如下:
```
public static <T> void exportToCsv(List<T> dataList, Class<T> clazz, String filePath) {
Field[] fields = clazz.getDeclaredFields(); // 获取所有字段
Set<String> upperCaseFields = new HashSet<>(); // 存储次位为大写字母的字段
for (Field field : fields) {
String fieldName = field.getName();
if (fieldName.length() >= 2 && Character.isUpperCase(fieldName.charAt(1))) {
upperCaseFields.add(fieldName);
}
}
try (CSVPrinter printer = new CSVPrinter(new FileWriter(filePath), CSVFormat.DEFAULT)) {
// 输出表头
List<String> headerList = new ArrayList<>();
for (Field field : fields) {
headerList.add(field.getName());
}
printer.printRecord(headerList);
// 输出数据
Set<String> printedFields = new HashSet<>(); // 存储已经输出过的字段
for (T data : dataList) {
List<String> recordList = new ArrayList<>();
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(data);
if (value == null) {
recordList.add("");
} else {
recordList.add(value.toString());
}
if (printedFields.contains(field.getName()) || !upperCaseFields.contains(field.getName())) {
continue; // 已经输出过或者不是次位为大写字母的字段,则不需要再输出
}
printer.print(field.getName()); // 输出次位为大写字母的字段
printedFields.add(field.getName()); // 标记为已输出
}
printer.printRecord(recordList);
}
} catch (IOException e) {
e.printStackTrace();
}
}
```