Lambda 表达式不实现传统面向对象多态,但支持行为多态:通过函数式接口+运行时Lambda注入,简化策略切换、泛型方法传参及Stream数据处理,适用于无状态、逻辑简单的场景。

Lambda 表达式本身不直接用于实现传统面向对象意义上的“多态”(如继承+重写),但它能显著简化**行为多态**——也就是同一接口在不同场景下表现出不同逻辑,而无需定义多个子类或实现类。这种简化聚焦于“策略可变、接口统一”的场景,本质是函数式接口 + 运行时动态赋值。
用 Lambda 替代简单策略类
当原本需要为同一个函数式接口写多个实现类来切换行为时,Lambda 可以一行代码就完成策略注入,避免冗余类文件。
- 比如排序逻辑:不用写
AscComparator、DescComparator两个类,直接传(a, b) -> a.compareTo(b)或(a, b) -> b.compareTo(a) - 比如日志级别判断:接口
LoggerStrategy只有一个shouldLog(String level)方法,传统方式要写多个实现类;用 Lambda 就是level -> "ERROR".equals(level)或level -> !level.equals("DEBUG") - 关键点:只要接口只有一个抽象方法(即函数式接口),就能被 Lambda 实现,且可在调用处即时定制
配合泛型方法和函数式参数统一入口
把 Lambda 当作“行为参数”传入通用方法,让一个方法支持多种处理逻辑,实现运行时行为多态。
- 例如定义:
<T> List<T> transform(List<T> list, Function<T, T> mapper) - 调用时可传不同 Lambda:
transform(names, s -> s.toUpperCase())或transform(numbers, n -> n * 2) - 无需修改方法签名,也不用新增子类,行为差异完全由传入的 Lambda 决定
结合 Stream API 实现数据处理多态
对同一批数据,用不同 Lambda 定义过滤、映射、归约逻辑,达到“数据不变、行为可变”的效果。
立即学习“Java免费学习笔记(深入)”;
-
list.stream().filter(x -> x > 10).map(x -> x * 2)和list.stream().filter(x -> x % 2 == 0).map(String::valueOf)处理逻辑完全不同,但都基于Stream统一模型 - 每个中间操作接受函数式接口(
Predicate、Function等),Lambda 让这些“行为插槽”填得干净又灵活 - 比传统 if-else 分支或工厂模式创建不同处理器更轻量、更内聚
注意边界:不是所有多态都适合用 Lambda
Lambda 擅长简化“一次性、逻辑简单、无状态”的行为变化;它不替代需要封装状态、复用复杂逻辑或参与继承体系的多态设计。
- 如果策略需要持有字段(如缓存、配置)、实现多个方法、或需被 Spring 管理为 Bean,仍应使用普通类
- Lambda 无法序列化(除非明确标记
Serializable),涉及网络传输或持久化的场景慎用 - 过度嵌套或过长的 Lambda 会损害可读性,此时建议提取为具名方法引用(如
MyUtils::process)


















