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

如何利用Java函数式API实现集合多Getter的通用处理?

解决方案:使用函数式接口提取对象属性

你需要的是属性提取器类型的函数式接口,而非Supplier(Supplier为无参接口,不适合从已有对象中提取属性)。Java标准库中的ToIntFunction<T>完全匹配你的场景:它接收一个T类型对象,返回int值,完美对应getA()、getB()这类Getter方法的签名。

修改后的实现代码

import java.util.ArrayList;
import java.util.List;
import java.util.function.ToIntFunction;

public class TestSupplier {
    private int varA;
    private int varB;

    public TestSupplier(int varA, int varB) {
        this.varA = varA;
        this.varB = varB;
    }

    public int getA() {
        return this.varA;
    }

    public int getB() {
        return this.varB;
    }

    // 后续新增属性,直接添加Getter即可
    public int getC() {
        return varA + varB;
    }

    public static void main(String[] args) {
        List<TestSupplier> testList = new ArrayList<>();
        testList.add(new TestSupplier(1, 11));
        testList.add(new TestSupplier(2, 22));

        // 传入方法引用,对应不同的Getter
        someCollectorFunction(testList, TestSupplier::getA);
        someCollectorFunction(testList, TestSupplier::getB);
        someCollectorFunction(testList, TestSupplier::getC); // 新增属性直接扩展
    }

    // 统一处理函数,用ToIntFunction替代布尔值参数
    public static void someCollectorFunction(List<TestSupplier> list, ToIntFunction<TestSupplier> propertyExtractor) {
        int sum = 0;
        for (TestSupplier obj : list) {
            // 通过提取器函数获取对应属性值,无需if/switch分支
            sum += propertyExtractor.applyAsInt(obj);
        }
        System.out.println("I have a sum: " + sum);
    }
}

核心优势说明

  • 彻底消除分支判断:不管新增多少个Getter,只需传入对应的方法引用TestSupplier::getX,无需修改someCollectorFunction的内部逻辑
  • 复用性极强:函数式接口的实现(方法引用)全局复用,无需为每个实例创建新对象
  • 类型安全:编译期即可检查传入的提取器是否匹配,避免布尔值/枚举值带来的运行时错误

如果你的属性不是int类型,可对应使用Function<T, R>(返回任意类型)、ToLongFunction<T>、ToDoubleFunction<T>等标准函数式接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:31:35