lambda表达式传递的是行为而非数据,它将可执行逻辑作为参数传入方法,要求目标接口为仅含一个抽象方法的函数式接口,适用于线程任务、集合过滤等场景。

Java 中 Lambda 表达式传递的是“行为”,不是数据。它把一段可执行逻辑(比如排序规则、线程任务、条件判断)当作参数直接塞进方法里,让方法在运行时调用这个逻辑,而不是传一个值或对象。
行为参数化:让方法接收“怎么做”,而不是“做什么”
传统方式中,你得先定义一个类或匿名内部类来封装行为,再传给方法。Lambda 把这一步压缩成一行代码:
- 原来要写
new Comparator<string>() { public int compare(...) { ... } }</string> - 现在直接写
(s1, s2) -> s1.length() - s2.length() - 方法(如
Collections.sort())不关心你怎么比,只负责在需要时调用你给的这个“怎么比”
必须基于函数式接口才能用 Lambda
Lambda 不是万能的,它只能赋值给**只有一个抽象方法**的接口(即函数式接口),比如 Runnable、Comparator、Predicate、Function 等:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 接口里不能有多个未实现的抽象方法,否则编译报错
- @FunctionalInterface 注解可显式声明并帮助编译器检查
- 接口中的 default 方法和 static 方法不影响函数式接口性质
常见行为传递场景示例
这些例子都体现“把动作当参数”:
-
启动线程:
new Thread(() -> System.out.println("跑起来了")).start();—— 传的是“要执行什么”,不是某个字符串或数字 -
过滤集合:
list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());—— 传的是“怎么判断是否留下”,不是具体某个元素 -
自定义消费动作:
forEach(s -> System.out.println("处理:" + s));—— 传的是“对每个元素干点啥”,不是元素本身
和匿名内部类的本质区别
两者都能传递行为,但 Lambda 更轻量、更聚焦逻辑本身:
- 匿名内部类会生成独立的 .class 文件,有完整类结构;Lambda 在编译后通常通过 invokedynamic 指令动态绑定,运行时更高效
- 匿名内部类能访问
this和实例变量,Lambda 只能访问有效 final 的局部变量(包括隐式 final) - 匿名内部类适合复杂行为(含多方法、状态),Lambda 适合单一、简洁的行为表达
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










