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

如何在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等工具):

NameAgeAddress
John45813 Howard Street Oswego NY 13126
Marc27123 Hogwarts

扩展方式

如果需要新增导出字段(比如email),只需两步:

  1. 在Person类中添加email属性及对应的Getter方法;
  2. 在EXPORT_CONFIGS集合中新增一个FieldExportConfig元素:
new FieldExportConfig<>("Email", Person::getEmail, email -> email)

无需修改export、printHeader、printRow等核心逻辑即可完成扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:05:25