如何将不同类的Getter函数作为参数传入Java泛型方法?
实现方案:传递不同类的Getter方法到泛型方法
你需要借助Java的函数式接口来传递Getter方法,针对你的场景——两个Getter都是接收对应类实例、返回基本类型long,最合适的是ToLongFunction<T>接口(它专门处理返回基本类型long的场景,比Function<T, Long>更高效,避免自动装箱拆箱的开销)。
修改后的泛型方法
import java.util.List; import java.util.function.ToLongFunction; // ... private <T> void sliceGenericData(List<T> peData, ToLongFunction<T> getterFunction) { // ... 原有业务代码 ... // 对列表中的每个泛型对象调用传入的Getter方法 for (T item : peData) { long value = getterFunction.applyAsLong(item); // 这里可以添加对value的后续处理逻辑 // 比如:processValue(value); } // ... 原有业务代码 ... }
调用示例
针对类A和类B的具体调用方式如下:
import java.util.Arrays; import java.util.List; // ... // 处理A类型的列表 List<A> listA = Arrays.asList(new A(), new A()); sliceGenericData(listA, A::getterFunction1); // 处理B类型的列表 List<B> listB = Arrays.asList(new B(), new B()); sliceGenericData(listB, B::getterFunction2);
为什么选择ToLongFunction?
因为你的两个Getter方法都返回基本类型long,ToLongFunction<T>的applyAsLong(T)方法直接返回long,不需要把基本类型装箱为Long对象,在性能上更优。如果后续你的Getter需要返回引用类型(比如String),可以改用Function<T, R>接口,方法定义如下:
private <T, R> void sliceGenericData(List<T> peData, Function<T, R> getterFunction) { for (T item : peData) { R value = getterFunction.apply(item); // 处理获取到的value } }
这种情况下调用时,泛型会自动推断返回类型,用法和之前一致:
sliceGenericData(listA, A::getterFunction1); // R自动推断为Long sliceGenericData(listB, B::getterFunction2);
内容的提问来源于stack exchange,提问作者Meric Ozcan
相关产品推荐
相关产品推荐

