1. Stream流基础概念解析
在Java 8引入的函数式编程特性中,Stream API无疑是最具革命性的特性之一。它彻底改变了我们处理集合数据的方式,让数据处理变得更声明式、更高效。Stream不是数据结构,而是一个来自数据源的元素队列,支持聚合操作。想象一下,它就像工厂里的流水线,数据像零件一样在不同工位(操作)间流转加工。
Stream的核心特点体现在三个方面:
- 流水线操作:可以将多个中间操作连接起来形成一条处理流水线
- 内部迭代:不同于集合的外部迭代(显式for循环),迭代操作由Stream在背后完成
- 延迟执行:中间操作都是惰性的,只有遇到终端操作才会真正执行
重要提示:Stream与Collection的主要区别在于,Collection存储的是实际数据元素,而Stream本身不存储元素,它只是对数据源的计算视图。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Stream操作类型详解
2.1 中间操作(Intermediate Operations)
中间操作会返回一个新的Stream,允许我们以链式方式连接多个操作。这些操作都是惰性的,意味着它们不会立即执行任何处理。
过滤类操作:
filter(Predicate<? super T>):根据条件过滤元素
java复制// 过滤出长度大于3的字符串
List<String> filtered = list.stream()
.filter(s -> s.length() > 3)
.collect(Collectors.toList());
映射类操作:
map(Function<? super T, ? extends R>):将元素转换为其他形式
java复制// 将字符串转换为大写
List<String> upperCase = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
去重与排序:
distinct():去除重复元素(依赖equals方法)sorted()/sorted(Comparator<? super T>):自然排序或自定义排序
2.2 终端操作(Terminal Operations)
终端操作会触发实际计算,产生结果或副作用。执行后Stream就不能再被使用。
聚合类操作:
count():返回元素总数min()/max():返回最小/最大值reduce():将元素组合起来产生单个值
收集类操作:
collect():将流转换为其他形式(最常用的终端操作)
java复制// 将流收集为Set
Set<String> set = list.stream()
.collect(Collectors.toSet());
遍历类操作:
forEach():对每个元素执行操作forEachOrdered():保证在并行流中的顺序
3. Stream高级特性与性能优化
3.1 并行流处理
Stream API内置支持并行处理,只需将stream()改为parallelStream()即可开启并行模式。但需要注意:
- 并非所有情况都适合并行,数据量小或操作简单时反而可能更慢
- 确保操作是无状态的,避免共享可变状态
- 考虑操作的顺序依赖性
java复制// 并行流示例
long count = largeList.paralle
