Java Stream API 完全指南:集合操作的艺术

全面介绍 Java Stream API 的核心操作,包括 filter、map、reduce、collect 等,提供丰富的示例。

Java 后端 2026-06-16 12 分钟

Java Stream API 完全指南:集合操作的艺术

Stream API 是 Java 8 引入的函数式编程特性,让集合操作更简洁。

创建 Stream

// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

// 从数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);

// 直接创建
Stream<String> stream = Stream.of("a", "b", "c");

// 生成
Stream<Integer> stream = Stream.iterate(0, n -> n + 1).limit(10);

中间操作

filter

// 过滤
list.stream()
    .filter(s -> s.startsWith("a"))
    .collect(Collectors.toList());

map

// 转换
list.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

sorted

// 排序
list.stream()
    .sorted()
    .collect(Collectors.toList());

distinct

// 去重
list.stream()
    .distinct()
    .collect(Collectors.toList());

limit/skip

// 分页
list.stream()
    .skip(10)
    .limit(5)
    .collect(Collectors.toList());

终端操作

collect

// 转为 List
List<String> list = stream.collect(Collectors.toList());

// 转为 Set
Set<String> set = stream.collect(Collectors.toSet());

// 转为 Map
Map<String, Integer> map = stream.collect(
    Collectors.toMap(User::getName, User::getAge)
);

reduce

// 求和
int sum = numbers.stream()
    .reduce(0, Integer::sum);

// 最大值
int max = numbers.stream()
    .reduce(Integer::max)
    .orElse(0);

forEach

// 遍历
list.stream()
    .forEach(System.out::println);

实用示例

分组

Map<Integer, List<User>> groupByAge = users.stream()
    .collect(Collectors.groupingBy(User::getAge));

统计

IntSummaryStatistics stats = users.stream()
    .mapToInt(User::getAge)
    .summaryStatistics();

stats.getAverage(); // 平均值
stats.getMax();     // 最大值
stats.getMin();     // 最小值
stats.getSum();     // 总和
stats.getCount();   // 数量

过滤 + 转换

List<String> names = users.stream()
    .filter(u -> u.getAge() > 18)
    .map(User::getName)
    .sorted()
    .collect(Collectors.toList());

并行流

// 并行处理
list.parallelStream()
    .filter(s -> s.startsWith("a"))
    .collect(Collectors.toList());

注意: 并行流使用 ForkJoinPool,不适合 IO 操作。

最佳实践

  1. 优先使用 Stream:比 for 循环更简洁
  2. 避免副作用:不要在 Stream 中修改外部变量
  3. 合理使用并行流:大数据量、CPU 密集型任务
  4. 使用方法引用:比 Lambda 更简洁

总结

Stream API 让集合操作更简洁、更函数式。掌握 Stream,可以写出更优雅的 Java 代码。

📚 相关文章