Java中的Stream

Java 中的 Stream 是 Java 8 引入的一种处理集合(如 List、Set)数据的强大工具,它允许你以声明式(声明“做什么”而不是“怎么做”)的方式处理数据。Stream 不是数据结构,而是一种对数据源(集合、数组等)进行操作的抽象。

1. Stream 的核心特点

  • 不是数据结构:它不会存储数据。
  • 一次性使用:Stream 一旦被消费就不能再使用。
  • 惰性执行:只有调用终止操作(如 collect()forEach())时才会执行。
  • 链式操作:支持链式调用多个操作(filter、map、sorted…)。
  • 支持并行处理:通过 parallelStream() 轻松实现并行处理。

2. Stream 的使用流程

通常包含三步:

  1. 创建流(Create a Stream)
  2. 中间操作(Intermediate Operations)
  3. 终止操作(Terminal Operation)

3. 举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;
import java.util.stream.*;

public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Amanda");

List<String> filteredNames = names.stream() // 创建流
.filter(name -> name.startsWith("A")) // 中间操作:筛选以A开头的
.map(String::toUpperCase) // 中间操作:转为大写
.sorted() // 中间操作:排序
.collect(Collectors.toList()); // 终止操作:收集为List

System.out.println(filteredNames); // 输出: [ALICE, AMANDA]
}
}

4. 常见的中间操作(返回 Stream)

方法 作用说明
filter() 过滤元素
map() 映射/转换元素
flatMap() 扁平化处理嵌套结构
sorted() 排序
distinct() 去重
limit(n) 限制前 n 个元素
skip(n) 跳过前 n 个元素
peek() 查看元素(通常用于调试)

5. 常见的终止操作(触发流执行)

方法 作用说明
forEach() 遍历每个元素
collect() 收集结果到 List、Set、Map 等集合
count() 统计数量
anyMatch()/allMatch() 是否匹配某些条件
findFirst()/findAny() 找到第一个/任意一个元素
reduce() 归约(如求和、求乘积等)

6. Stream 与 Optional、Lambda 的关系

  • Stream 依赖于 Lambda 表达式(如 n -> n.startsWith("A"))来实现函数式处理。
  • Optional 类似,Stream 也体现了函数式编程风格。
  • Optional 也有类似 mapfilterflatMap 的方法。