如何利用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
相关产品推荐
相关产品推荐

