如何在Java中用数组存储成员Getter引用及对应转换函数?
可扩展的Java对象列表转表格方案
需求概述
我有一个人员对象列表,每个Person包含name、age、address等属性,需要将其导出为表格格式,要求后续新增导出字段时,无需修改核心导出逻辑,仅需添加配置项即可。我有C++背景,希望用类似函数指针的方式封装字段的获取与转换逻辑。
实现思路
定义一个配置集合,每个元素封装三个关键信息:表格表头名称、从Person对象中获取属性的方法(对应C++的函数指针)、属性值的转换函数(将属性转为表格单元格的字符串内容)。核心导出逻辑遍历该配置集合,统一处理每个字段的读取和输出,实现扩展时仅需新增配置项。
代码实现
Person类定义
public class Person { private String name; private Integer age; private Address address; // 构造方法 public Person(String name, Integer age, Address address) { this.name = name; this.age = age; this.address = address; } // Getter方法 public String getName() { return name; } public Integer getAge() { return age; } public Address getAddress() { return address; } } // 地址类示例 class Address { private String fullAddress; public Address(String fullAddress) { this.fullAddress = fullAddress; } public String getFullAddress() { return fullAddress; } }
导出工具类实现
import java.util.List; import java.util.function.Function; public class PersonTableExporter { // 封装字段导出配置的记录类 private record FieldExportConfig<T>( String header, Function<Person, T> getter, Function<T, String> converter ) {} // 导出配置集合,新增字段只需在此添加元素 private static final List<FieldExportConfig<?>> EXPORT_CONFIGS = List.of( new FieldExportConfig<>("Name", Person::getName, name -> name), new FieldExportConfig<>("Age", Person::getAge, age -> age.toString()), new FieldExportConfig<>("Address", Person::getAddress, Address::getFullAddress) ); public static void export(List<Person> persons) { // 输出表头 printHeader(); // 输出每行数据 for (Person person : persons) { printRow(person); } } private static void printHeader() { StringBuilder headerLine = new StringBuilder(); for (FieldExportConfig<?> config : EXPORT_CONFIGS) { headerLine.append(config.header()).append("\t"); } System.out.println(headerLine.toString().trim()); } private static void printRow(Person person) { StringBuilder rowLine = new StringBuilder(); for (FieldExportConfig<?> config : EXPORT_CONFIGS) { Object value = config.getter().apply(person); String cellContent = ((Function<Object, String>) config.converter()).apply(value); rowLine.append(cellContent).append("\t"); } System.out.println(rowLine.toString().trim()); } // 测试示例 public static void main(String[] args) { List<Person> persons = List.of( new Person("John", 45, new Address("813 Howard Street Oswego NY 13126")), new Person("Marc", 27, new Address("123 Hogwarts")) ); export(persons); } }
最终输出效果
运行上述代码后,会输出如下格式的表格(以制表符分隔,可直接导入Excel等工具):
| Name | Age | Address |
|---|---|---|
| John | 45 | 813 Howard Street Oswego NY 13126 |
| Marc | 27 | 123 Hogwarts |
扩展方式
如果需要新增导出字段(比如email),只需两步:
- 在
Person类中添加email属性及对应的Getter方法; - 在
EXPORT_CONFIGS集合中新增一个FieldExportConfig元素:
new FieldExportConfig<>("Email", Person::getEmail, email -> email)
无需修改export、printHeader、printRow等核心逻辑即可完成扩展。
内容的提问来源于stack exchange,提问作者Dominic x
相关产品推荐
相关产品推荐

