2025-08-28 15:17

Java Stream 流详解

王姐姐

Java后端

(106)

(0)

收藏

什么是 Stream?

Stream 是 Java 8 引入的数据处理工具,用于对集合(List、Set 等)或数组进行函数式操作,如过滤、映射、排序、统计等。

它不是数据结构,不存储数据,而是对数据的流水线操作


三大步骤

  1. 获取流(Source)

  2. 中间操作(Intermediate Operations)—— 返回新流,可链式调用

  3. 终止操作(Terminal Operation)—— 触发执行,返回结果

list.stream()           // 1. 获取流
    .filter(s -> s.length() > 3)  // 2. 中间操作:过滤
    .map(String::toUpperCase)     // 2. 中间操作:转换
    .sorted()                     // 2. 中间操作:排序
    .forEach(System.out::println); // 3. 终止操作:打印

常用方法

中间操作(返回 Stream,可链式调用)

方法

说明

filter(Predicate)

过滤:保留符合条件的元素

map(Function)

转换:将元素转换成另一种形式

flatMap()

扁平化:将流中的流合并成一个流

distinct()

去重

sorted()

排序

limit(n)

限制前 n 个元素

skip(n)

跳过前 n 个元素

终止操作(触发执行,返回结果)

方法

说明

forEach()

遍历每个元素

collect()

收集结果(如转为 List、Set)

count()

统计数量

anyMatch() / allMatch() / noneMatch()

匹配判断

findFirst() / findAny()

查找元素

reduce()

聚合计算(如求和)


实用示例

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");

// 1. 过滤长度 > 5 的,并转大写
List<String> result = list.stream()
    .filter(s -> s.length() > 5)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// 2. 求所有字符串长度总和
int sum = list.stream()
    .mapToInt(String::length)
    .sum();

// 3. 判断是否有以 "a" 开头的
boolean hasA = list.stream().anyMatch(s -> s.startsWith("a"));

特点

  • 不修改原集合:操作产生新流或结果。

  • 惰性执行:中间操作不立即执行,直到终止操作触发。

  • 支持并行流parallelStream() 可自动多线程处理,提升性能(注意线程安全)。

list.parallelStream().filter(...).forEach(...); // 自动并行

适用场景

  • 数据过滤、转换、统计

  • 集合处理代码更简洁、函数式

  • 大数据量处理(配合并行流)


总结

Stream = 源 + 中间操作(流水线) + 终止操作(触发执行)

优势:代码简洁、可读性强、支持函数式编程、易于并行处理
建议:替代传统 for 循环做集合处理,提升开发效率。



0条评论

点击登录参与评论