1. 引言

Java 8 引入 Stream API 彻底改变了集合操作的方式。Stream API 提供了简洁且富有表现力的数据处理方法,让开发者能写出更可读、更健壮、更高效的代码。

本教程将深入探讨 Stream 操作的有趣世界,重点关注空 List 的处理。虽然操作空 List 看似简单,但它能揭示 Stream API 的强大特性。

2. 将空 List 转换为 Stream

使用 stream() 方法可以轻松从空 List 获取 Stream:

List<String> emptyList = new ArrayList<>();
Stream<String> emptyStream = emptyList.stream();

这让我们能像处理非空 List 一样对空 List 执行各种 Stream 操作。但需要注意:由于 Stream 源为空,操作结果也可能是空的。建议进一步了解 Java 中空 Stream 的处理方式

3. 空 Stream 在处理 NullPointerException 中的意义

使用 Stream 处理空 List 的显著优势是能避免 NullPointerException。考虑以下场景,getList() 方法可能返回 null:

List<String> nameList = getList(); // 假设 getList() 可能返回 null

// 传统方式
if (nameList != null) {
    for (String str : nameList) {
        System.out.println("Length of " + name + ": " + name.length());
    }
}

传统方式必须显式检查 null 才能安全遍历 List。

使用 Optional 和 Stream 可以优雅解决

// Stream 方式
Optional.ofNullable(nameList)
  .ifPresent(list -> list.stream()
    .map(name -> "Length of " + name + ": " + name.length())
    .forEach(System.out::println));

✅ 关键优势:

  • Optional.ofNullable() 包装 nameList,避免 null 导致的异常
  • ifPresent() 确保仅在 List 非空时执行操作
  • 空 Stream 的操作不会抛出异常
  • 代码更简洁,无需显式 null 检查

⚠️ 注意:如果 getList() 返回空 List 而非 null,map() 操作将无数据可处理,最终 forEach() 不会输出任何内容。

两种方式对比: | 方式 | 优点 | 缺点 | |------|------|------| | 传统 | 直观 | 需显式 null 检查 | | Stream | 简洁、函数式 | 需理解 Optional 机制 |

4. 将空 List 的 Stream 收集到另一个 List

Stream 提供了优雅的操作和结果收集方式,即使处理空 List 也能高效工作。示例:将空 List 收集到新 List:

List<String> emptyList = new ArrayList<>();
List<String> collectedList = emptyList.stream().collect(Collectors.toList());

System.out.println(collectedList); // 输出: []

collect() 是终端操作,对 Stream 元素执行可变归约。

即使添加中间操作(如 filter()),结果仍是空 Stream:

List<String> emptyList = new ArrayList<>();
List<String> collectedList = emptyList.stream()
  .filter(s -> s.startsWith("a"))
  .collect(Collectors.toList());

这证明空 List 的 Stream 操作能无缝集成到结果收集中,不会引发任何问题

5. 结论

Java 8 对空 List 的 Stream 操作充分展示了 Stream API 的优雅和健壮性:

  • 轻松转换空 List 为 Stream
  • 优雅处理潜在的 NullPointerException
  • 无缝执行收集等操作

掌握这些特性,开发者能编写更简洁、更具表现力的代码,即使处理空 List 也能充分发挥 Stream API 的威力。

本文源代码可在 GitHub 获取。


原始标题:Java Stream Operation on the Empty List | Baeldung