侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用Stream API优化集合处理

2025-12-5 / 0 评论 / 6 阅读

题目

使用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()提前终止流处理