Java Stream API
Published on Nov 25, 2025, with 1 view(s) and 0 comment(s)
Ai 摘要:Java Stream API是Java 8引入的全新数据处理方式,用于处理集合和数组。它以声明式、链式调用的风格,通过创建Stream、中间操作(如过滤、映射)和终端操作(如收集、统计)三大步骤,简化了集合处理,并支持并行流以获得高性能。

🌊 Java Stream API 是什么?

Stream API 是 Java 8 引入的用于处理集合(Collection)或数组的一种全新数据处理方式。

特点:

  • 声明式(不需要写 for 循环)
  • 链式调用(像 SQL)
  • 内部迭代(由 Stream 自己遍历)
  • 高性能(支持并行流)

🌟 Stream 的三大步骤(核心套路)

  1. 创建 Stream(Source)
  2. 中间操作(Intermediate) → 过滤、映射、排序 …
  3. 终端操作(Terminal) → 收集、求和、统计、forEach

1️⃣ 创建 Stream

List<String> list = Arrays.asList("Java", "Stream", "API");

// 从集合创建 Stream
Stream<String> stream1 = list.stream();

// 从数组创建
Stream<Integer> stream2 = Stream.of(1, 2, 3, 4);

// 无限流
Stream<Double> random = Stream.generate(Math::random);

2️⃣ 中间操作(常用)

✔ filter 过滤

list.stream()
    .filter(s -> s.length() > 3)

✔ map 映射(值转换)

list.stream()
    .map(String::toUpperCase)

✔ sorted 排序

list.stream()
    .sorted()

✔ distinct 去重

list.stream()
    .distinct()

✔ limit / skip

list.stream()
    .skip(2)
    .limit(3)

3️⃣ 终端操作(常用)

✔ collect 转 List

List<String> result = list.stream()
    .filter(s -> s.startsWith("J"))
    .collect(Collectors.toList());

✔ forEach

list.stream().forEach(System.out::println);

✔ count

long count = list.stream().count();

✔ 求最大/最小

Optional<Integer> max = Stream.of(1, 5, 3).max(Integer::compareTo);

🎯 常用实战案例

📌 案例 1:过滤 + 映射 + 收集

List<String> names = Arrays.asList("jack", "tom", "jerry");

List<String> result = names.stream()
    .filter(n -> n.length() > 3)   // 过滤
    .map(String::toUpperCase)      // 转大写
    .collect(Collectors.toList()); // 转回 List

System.out.println(result); // [JACK, JERRY] 

📌 案例 2:对对象列表过滤

class User {
    String name;
    int age;
}

List<User> users = ...
List<User> adults = users.stream()
    .filter(u -> u.getAge() >= 18)
    .collect(Collectors.toList());

📌 案例 3:分组 groupingBy

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

📌 案例 4:根据某个字段排序

List<User> sorted = users.stream()
    .sorted(Comparator.comparing(User::getAge))
    .collect(Collectors.toList());

📌 案例 5:统计 sum / avg

int totalAge = users.stream()
    .mapToInt(User::getAge)
    .sum();

📌 案例 6:任意匹配 / 全部匹配 / 无匹配

users.stream().anyMatch(u -> u.getAge() > 18); // 有人 > 18?
users.stream().allMatch(u -> u.getAge() > 0);  // 全部 > 0?
users.stream().noneMatch(u -> u.getAge() < 0); // 无人 < 0? 

🚀 并行流(多线程加速大数据处理)

list.parallelStream()
    .filter(...)
    .map(...)
    .collect(Collectors.toList());

适用于大规模数据处理。

🔥 最后快速记忆口诀

stream()
   .filter()   // 过滤
   .map()      // 转换
   .sorted()   // 排序
   .collect()  // 终结