# Java Lambda表达式详解
## 📌 核心概念
**Lambda表达式**是Java 8引入的匿名函数特性,用于简化函数式编程的实现。
## 🎯 基本语法
### 标准格式
```java
(参数列表) -> { 方法体 }
```
### 简化形式
```java
// 单参数可省略括号
x -> x * 2
// 单行表达式可省略大括号和return
(a, b) -> a + b
// 无参数
() -> System.out.println("Hello")
```
## 🔑 函数式接口要求
Lambda必须与**只有一个抽象方法**的接口配合使用:
| 接口类型 | 方法签名 | 用途 |
|---------|---------|------|
| `Predicate<T>` | `boolean test(T t)` | 条件判断 |
| `Function<T,R>` | `R apply(T t)` | 类型转换 |
| `Consumer<T>` | `void accept(T t)` | 消费操作 |
| `Supplier<T>` | `T get()` | 数据提供 |
| `Runnable` | `void run()` | 线程任务 |
## 💡 核心特性对比
### 传统写法 vs Lambda写法
```java
// 传统匿名内部类
Runnable task1 = new Runnable() {
@Override
public void run() {
System.out.println("Task 1");
}
};
// Lambda简化版本
Runnable task2 = () -> System.out.println("Task 2");
```
### 类型推断示例
```java
// 完整类型声明
Comparator<String> c1 = (String s1, String s2) -> s1.compareTo(s2);
// 编译器类型推断
Comparator<String> c2 = (s1, s2) -> s1.compareTo(s2);
```
## 🚀 实际应用场景
### 1. 集合操作(结合Stream API)
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 过滤 + 转换 + 遍历
names.stream()
.filter(name -> name.length() > 3) // 过滤条件
.map(String::toUpperCase) // 方法引用
.forEach(System.out::println); // 消费操作
```
### 2. 线程创建
```java
// 创建并启动线程
new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Count: " + i);
}
}).start();
```
### 3. 事件处理
```java
// Swing按钮点击事件
JButton button = new JButton("Click");
button.addActionListener(e ->
System.out.println("Button clicked at: " + new Date())
);
```
### 4. 排序操作
```java
List<Person> people = getPeopleList();
// 按年龄排序
people.sort((p1, p2) -> p1.getAge() - p2.getAge());
// 多条件排序
people.sort(Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
);
```
## 📝 方法引用(进一步简化)
| 类型 | 语法 | 等效Lambda |
|------|------|------------|
| 静态方法 | `类名::静态方法` | `(args) -> 类名.静态方法(args)` |
| 实例方法 | `对象::实例方法` | `(args) -> 对象.实例方法(args)` |
| 任意对象的实例方法 | `类名::实例方法` | `(obj, args) -> obj.实例方法(args)` |
| 构造器 | `类名::new` | `(args) -> new 类名(args)` |
### 示例对比
```java
// Lambda表达式
list.forEach(item -> System.out.println(item));
// 方法引用(更简洁)
list.forEach(System.out::println);
```
## ⚠️ 变量访问规则
### 允许的操作
```java
final int fixedValue = 10;
int effectivelyFinal = 20; // 未重新赋值,等效final
Runnable r = () -> {
System.out.println(fixedValue); // ✅ 可以读取final变量
System.out.println(effectivelyFinal); // ✅ 可以读取等效final变量
};
```
### 禁止的操作
```java
int mutable = 30;
Runnable r = () -> {
// System.out.println(mutable++); // ❌ 编译错误:不能修改外部变量
};
```
## ✅ 优势总结
1. **代码简洁** - 减少模板代码70%以上
2. **可读性高** - 意图更明确
3. **便于并行** - 天然适合并行处理
4. **函数式编程** - 支持高阶函数操作
## 🚫 使用限制
1. **不能独立存在** - 必须赋值给函数式接口
2. **异常处理** - 不能在参数列表声明throws
3. **控制语句** - 不能使用break/continue跳出外部循环
4. **this关键字** - 引用的是创建Lambda的类,不是Lambda自身
## 📊 完整示例合集
```java
public class LambdaDemo {
public static void main(String[] args) {
// 1. 数学运算
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
System.out.println("10 + 5 = " + add.calculate(10, 5));
System.out.println("10 × 5 = " + multiply.calculate(10, 5));
// 2. 集合处理
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 偶数筛选并平方
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println("Processed: " + result);
// 3. 条件执行
processIf(true, () -> System.out.println("条件成立执行"));
}
interface Calculator {
int calculate(int a, int b);
}
static void processIf(boolean condition, Runnable task) {
if (condition) task.run();
}
}
```
## 🎓 最佳实践建议
1. **保持简短** - Lambda体最好不超过3行
2. **使用方法引用** - 当仅调用现有方法时
3. **避免副作用** - 尽量编写纯函数
4. **合理命名参数** - 增强可读性
5. **复杂逻辑提取** - 过长Lambda应提取为独立方法
---
💡 **提示**:Lambda表达式是Java函数式编程的基石,熟练掌握后能大幅提升代码质量和开发效率。建议结合实际项目多加练习!
- 环境配置
- window怎么配置java环境变量?
- SQL学习
- 字段类型
- 1、 所有可声明的字段类型
- 2、常用的可声明的字段类型
- 创建表和表内字段
- 1、整个创建表语句
- 2、设置id主键
- 3、设置业务主键,唯一索引
- 4、设置业务字段
- 5、普通索引
- 6、唯一索引与普通索引的区别
- 7、表的引擎、字符集、排序规则和注释的设置
- Java基础语法
- 数据类型
- Java中的数据类型
- LocalDate
- 常用的数据类型
- Java 常用数据类型方法
- Java中数组、list、Map、HashMap
- 如何用Map来优化那些复杂的“双重 for 循环”查询?
- Java 8 中steam()操作流
- Java中HashMap和JSON
- Java中的JSONObject
- 工具类
- Java 常用工具类
- Arrays工具类
- Java 时间工具类
- 泛型
- Java中泛型概念
- Java中的泛型容器
- 泛型参数与函数参数的区别
- 推断出泛型实参
- Lambda表达式
- 数据分层
- 异常处理
- Java8 异常处理类总结表
- MyBatis-Plus 常用异常类总结表
- Java高级特性
- Maven
- jib-maven-plugin
- 什么是Spring Boot 的 parent pom?
- maven中各个生命周期的含义
- Spring Boot
- maven与spring boot 的关系
- Java中的连接池
- Spring JDBC
- Spring JDBC的概念
- JdbcTemplate常用的方法
- Spring中Bean的概念
- Spring中的抽象,通俗解释一下
- Spring中的事物
- Spring中的事物,通俗解释一下
- Spring中的事物抽象,常见的有哪些,列举一下
- Spring中常用的事物场景有哪些,列举一下
- Spring事务管理有哪些注解?
- Spring中使用事物处理订单的案例,列举说明一下
- Spring中声明式事务、分布式事务以及编程式事务的区别,列举一下
- 配置文件
- application-properties配置文件
- Spring Boot 的启动
- spring boot项目如何启动?
- 列举一下Spring Boot的启动过程
- SpringApplication.run方法
- Spring Boot 启动时有哪些接口?
- CommandLineRunner
- Spring Boot 的常用注解
- 系统注解
- 表格:系统注解
- @Override
- @Deprecated
- @SuppressWarnnings
- 使用在类名上的注解
- 表格:使用在类名上的注解
- @RestController
- @Controller
- @Service
- @Repository
- @Component
- @Configuration
- @Resource
- @Autowired
- @RequestMapping
- @GetMapping
- @PostMapping
- @Transactional
- @Qualifier
- 使用在方法上的注解
- 表格:使用在方法上的注解
- @RequestBody
- @PathVariable
- @Bean
- @ResponseBody
- @PreAuthorize
- 其他常用注解
- 表格:其他常用注解
- @EnableAutoConfiguration
- @SpringBootApplication
- @EnableScheduling
- @EnableAsync
- @ComponentScan
- @Aspec
- @ControllerAdvice
- @ExceptionHandler
- @Value
- @ConfigurationProperties
- @EnableConfigurationProperties
- @MapperScan
- @ApiOperation
- @Produces
- Validator验证的常用注解
- spring IoC容器
- Spring IoC容器依赖注入实现方式
- 常用依赖
- RESTEasy
- resteasy简介
- RESTEasy框架(依赖)的功能和常用注解
- MyBatis
- 简介
- paginationInterceptor
- @TableName
- @TableId
- @Param
- MyBatis-Plus
- MyBatis-Plus简介
- MyBatis-Plus的工具类
- Mybatis-Plus扩展的工具类和方法
- MyBatis-Plus中最常用的工具类方法
- MyBatis-Plus 中最常用的 4 大核心工具类
- Wrapper条件构造器
- Wrapper条件构造器详解
- Wrapper条件构造器eq等方法的参数说明
- LambdaQueryWrapper与QueryWrapper
- 日期格式是否必须转换
- Lombok
- Lombok作用详解
- @Data
- @Slf4j
- @Builder
- @EqualsAndHashCode
- @Accessors
- Jackson
- Jackson简介
- @JsonFormat
- Jackson高效地在 HashMap 和 JSON 字符串之间进行相互转换
- Hutool
- Hutool简介
- hutool依赖常用的方法
- fastjson2
- fastjson2简介
- UrlBasedCorsConfigurationSource
- 生态相关
- JBoss 社区
- 支付系统
- 1. 初始化mysql数据库流程
- 2. 初始化redis数据库的流程
- 3. 初始化rabbitmq服务
- 环球置业
- 1.模块目录结构分析
- 2. DTO(数据传输层)的核心作用
- 3. VO(视图对象层)
- 4. VO(视图对象层)和 DTO 数据传输层 的区别
