题目
使用Stream API优化集合处理
信息
- 类型:问答
- 难度:⭐⭐
考点
Stream API, Lambda表达式, 集合处理
快速回答
使用Stream API优化集合处理的关键步骤:
- 使用
stream()方法创建流 - 通过
filter过滤年龄大于30的员工 - 使用
map提取员工姓名 - 通过
collect(Collectors.toList())收集结果 - 利用并行流
parallelStream()提升性能(需线程安全)
问题场景
现有员工集合List<Employee> employees,需要:
1. 筛选年龄>30的员工
2. 提取姓名
3. 收集到新列表
传统写法 vs Stream API
// 传统写法(Java 7-)
List<String> names = new ArrayList<>();
for (Employee emp : employees) {
if (emp.getAge() > 30) {
names.add(emp.getName());
}
}
// Stream API写法(Java 8+)
List<String> names = employees.stream()
.filter(emp -> emp.getAge() > 30)
.map(Employee::getName)
.collect(Collectors.toList());核心原理
- 流式处理:将操作分为中间操作(filter/map)和终端操作(collect),延迟执行
- Lambda表达式:
emp -> emp.getAge() > 30简化匿名内部类 - 方法引用:
Employee::getName替代Lambda表达式
最佳实践
- 避免状态干扰:确保Lambda表达式无副作用(不修改外部变量)
- 优先使用无状态操作:如filter/map优于sorted/distinct
- 并行流谨慎使用:
employees.parallelStream()仅当数据量大且操作耗时时有收益,需确保线程安全
常见错误
- 重复使用流:流只能被消费一次,二次使用抛出
IllegalStateException - 忽略空指针:
filter(Objects::nonNull)防止空元素 - 混淆中间/终端操作:忘记调用
collect()等终端操作导致流未执行
扩展知识
- 其他收集器:
Collectors.toSet(),Collectors.joining(", ") - 数值流优化:
mapToInt(Employee::getAge).sum()避免装箱开销 - 流短路操作:
findFirst(),anyMatch()提前终止流处理