函数式接口配合泛型设计通用方法的核心是行为与类型解耦:泛型确定数据类型,函数式接口封装业务逻辑;定义泛型函数式接口(如mapper),通用方法接收其作为参数,支持类型安全与高复用。

函数式接口配合泛型设计通用方法,核心是让行为(函数逻辑)和类型(数据结构)解耦:用泛型确定操作的数据类型,用函数式接口封装可变的业务逻辑。这样写出来的工具方法既类型安全,又高度复用。
泛型 + 函数式接口组合的基本结构
定义一个泛型函数式接口,其抽象方法接收泛型参数、返回泛型结果(或 void),再在通用方法中将其作为参数传入。例如:
- 接口定义:@FunctionalInterface interface Mapper
{ R apply(T t); } - 通用方法签名:public static
List transform(List list, Mapper mapper) - 调用时自动推断 T 和 R,比如把 List
转成 List ,无需强制转换
处理多参数或复杂逻辑时的泛型函数式接口
当需要两个输入、一个输出,或带条件判断时,可自定义泛型函数式接口,不依赖 JDK 内置(避免类型擦除带来的限制):
- 如 BiProcessor
:R process(T a, U b),适用于合并、比较、计算等场景 - 搭配 Lambda 使用:
new BiProcessor<string integer string>() { public String process(String s, Integer i) { return s + i; } }</string>,或更简洁地写成 (s, i) -> s + i - 注意:泛型参数个数不限,但建议控制在 3 个以内,否则可读性下降
结合反射与泛型边界提升实用性
纯泛型方法有时需运行时获取真实类型(如 DAO 层通用查询),此时可配合泛型边界(
- 声明方法:public
T findById(Class clazz, Long id) - 内部通过
clazz.getSimpleName()拼表名,用clazz.getConstructor().newInstance()构造实例 - 泛型边界确保传入类型具备公共字段(如 id、createTime),避免运行时 ClassCastException
避免常见陷阱
泛型 + 函数式接口看似灵活,但几个细节容易出错:
- 不要在函数式接口中使用原始类型(如 int),统一用包装类(Integer),否则无法参与泛型推导
- Lambda 表达式里的泛型不能显式声明(如 (String s) -> s.length() 中的 String 是编译器推断的),若需明确类型,可用方法引用或匿名内部类
- 泛型方法的类型参数必须出现在参数列表或返回值中,否则编译器无法推断(如
<t> void log(T t)</t>可推断,<t> void log()</t>不行)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











